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"):
質問
Ajaxでempty
を送信しているときに、コントローラーでnull
値を取得するのはなぜですか?
以下のような私の問題を解決するより良い方法とよりエレガントなものはありますか?
public string FirstName
{
get { return _firstName; }
set { _firstName = value ?? string.Empty; }
}
C#で文字列変数を宣言すると、値が割り当てられるまで、その値はnull
になります。
フォーム送信を介してデータが送信される場合、情報が入力されていないフィールドは空の文字列として送信されます。 情報なしの最良の類似物はnull
であるため、これらの値はnull
に設定されます(または、ほとんどの場合、値は設定されません)。
情報が提供されなかったためMVCは空の文字列と、送信前にJavaScriptで割り当てられた値であるため空の文字列を区別できません。フィールドの1つに情報がないことがわかっているため、値はnull
である必要があります。