asp.net MVC で最初のモデル バインダーを作成しました。「fm_」で始まる名前を持つすべての入力を持つ純粋な HTML フォームから始めました。
public class HuggiesModel
{
public string fm_firstname { get; set; }
public DateTime fm_duedate { get; set; }
}
デフォルトのバインダーは問題なく機能し、時間の節約になったと思います。
次に、よりクリーンなプロパティ名が必要だと判断したため、次のように変更しました。
[ModelBinder(typeof(HuggiesModelBinder))]
public class HuggiesModel
{
public string FirstName { get; set; }
public DateTime? DueDate { get; set; }
}
モデル バインダー:
public class HuggiesModelBinder : IModelBinder
{
private HttpRequestBase request;
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
throw new ArgumentNullException("bindingContext");
this.request = controllerContext.HttpContext.Request;
var model = new HuggiesModel
{
FirstName = GetQueryStringValue("fm_firstname"),
};
string dateTimeString = GetQueryStringValue("fm_duedate");
model.DueDate = string.IsNullOrWhiteSpace(dateTimeString)
? default(DateTime?)
: DateTime.Parse(dateTimeString);
return model;
}
private string GetQueryStringValue(string key)
{
if (this.request.HttpMethod.ToUpper() == "POST")
return this.request.Form[key];
return this.request.QueryString[key];
}
}
DateTime を解析してデフォルトのバインダーを取得する必要がないように、これを実装する方法はありますか?
注:
フォーム入力名を希望のモデル名に合わせて変更できることはわかっていますが、モデルバインダーの作成経験を積むために意図的にそうしなかったため、この質問に至りました。
質問のタイトルは、私がやろうとしていることの概念的なアイデアに基づいています-次のようなチェーンを作成します:
request
-> default model binder binds get/post data to first view model
-> my model binder binds first view model to second view model
-> controller action method is called with second view model