12

次のコードがあります。

[HttpGet]
public ActionResult Edit(int req)
{
    var viewModel = new  EditViewModel();
    viewModel.RequestId = int;
    return View(viewModel);
}

[HttpPost]
Public ActionResult Edit(EditViewModel viewModel)
{
// some code here...
}

正常に動作します。編集フォームが投稿されると、アクション コントローラーが呼び出されます。

ここで、次のようにコードを少し変更します。

[HttpGet]
public ActionResult Edit(int req)
{
    var viewModel = new  EditViewModel(req);
    return View(viewModel);
}

[HttpPost]
Public ActionResult Edit(EditViewModel viewModel)
{
// some code here...
}

public class EditViewModel()
{
    public EditViewModel(int req)
    {
        requestId = req; 
    }
    ...
}

この新しいバージョンでは、コンストラクターを持つビュー モデルがあります。

今回は、フォームがポストバックされたときに、アクション コントローラーがトリガーされることはありません。

何か案が?

ありがとう。

4

2 に答える 2

23

それは正常です。デフォルトのモデルバインダーは、パラメーターのないコンストラクターを持たないため、ビューモデルをインスタンス化できなくなりました。デフォルトのコンストラクターを持たないビューモデルを使用する場合は、カスタムモデルバインダーを作成する必要があります。

通常、このようなカスタムコンストラクタは必要ありません。あなたは単にそのようなあなたのビューモデルを持つことができます:

public class EditViewModel()
{
    public int RequestId { get; set; }
}

そしてそのようなPOSTアクション:

[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
    // some code here...
}

そして今あなたがしなければならないのはrequestId代わりにパラメータをPOSTすることだけでreqあり、デフォルトのモデルバインダーがその仕事をします。

また、何らかの理由でカスタムコンストラクターでビューモデルを使用したい場合は、カスタムモデルバインダーがどのように見えるかの例を次に示します。

public class EditViewModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var req = bindingContext.ValueProvider.GetValue("req");
        if (req == null)
        {
            throw new Exception("missing req parameter");
        }
        int reqValue;
        if (!int.TryParse(req.AttemptedValue, out reqValue))
        {
            throw new Exception(string.Format("The req parameter contains an invalid value: {0}", req.AttemptedValue));
        }

        return new EditViewModel(reqValue);
    }
}

Application_Startこれはあなたの:に登録されます

ModelBinders.Binders.Add(typeof(EditViewModel), new EditViewModelBinder());
于 2012-02-23T12:46:35.100 に答える