web-dev-qa-db-ja.com

Ajaxは空の値を渡しますが、コントローラーはASP.NET MVCでnullを取得します

ASP.NET MVCおよびAjaxからコントローラーに送信される値に問題があります。

次のようなSampleViewModelがあるとしましょう:

public class SampleViewModel
{
    private string _firstName = string.Empty;

    public SampleViewModel()
    {
        _firstName = string.Empty;
    }

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value ?? string.Empty; }
    }

    public string LastName { get; set; }

    public string FullName { get; set; }
}

コントローラー

[HttpPost]
public JsonResult ActionSubmit(SampleViewModel model)
{               
    var result = "";

    if(model.FirstName == null)
          result += "\nFirstName is null";

    if(model.LastName == null)
          result += "\nLastName is null";

    return Json(result);
}

Ajax

$('.submit').click(function() {
        $.ajax({
            url: '@Url.RouteUrl(new{ action="ActionSubmit", controller="Home"})',
            data: JSON.stringify({ FirstName: '', LastName: '', FullName: 'Phong_Nguyen' }),
                  // Even though I use { FirstName: '', LastName: '', FullName: 'Phong_Nguyen' } without JSON.stringify
            type: 'POST',
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            success: function(resp) {
                   alert(resp);
            }});
         });

ご覧のとおり、空の値を送信していますが、コントローラーの端でnullを取得しています(応答値は常に "LastName is null"): enter image description here

質問

  1. Ajaxでemptyを送信しているときに、コントローラーでnull値を取得するのはなぜですか?

  2. 以下のような私の問題を解決するより良い方法とよりエレガントなものはありますか?

public string FirstName
{
   get { return _firstName; }
   set { _firstName = value ?? string.Empty; }
}
6
Phong

C#で文字列変数を宣言すると、値が割り当てられるまで、その値はnullになります。

フォーム送信を介してデータが送信される場合、情報が入力されていないフィールドは空の文字列として送信されます。 情報なしの最良の類似物はnullであるため、これらの値はnullに設定されます(または、ほとんどの場合、値は設定されません)。

情報が提供されなかったためMVCは空の文字列と、送信前にJavaScriptで割り当てられた値であるため空の文字列を区別できません。フィールドの1つに情報がないことがわかっているため、値はnullである必要があります。

0
Nathan Miller