gpt4 book ai didi

c# - 当我的 View 模型有构造函数时发布数据不起作用

转载 作者:行者123 更新时间:2023-12-03 01:52:53 26 4
gpt4 key购买 nike

我有以下代码:

[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...
}

它工作正常:当发布编辑表单时,我有被调用的操作 Controller 。

现在我修改了一些代码,如下所示:

[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;
}
...
}

在这个新版本中,我有一个带有构造函数的 View 模型。

这一次,当我的表单被发回时, Action Controller 永远不会被触发。

有什么想法吗?

谢谢。

最佳答案

这很正常。默认模型绑定(bind)器无法再实例化您的 View 模型,因为它没有无参数构造函数。如果您想使用没有默认构造函数的 View 模型,则必须编写自定义模型绑定(bind)器。

通常你不需要这样的自定义构造函数。您可以简单地拥有这样的 View 模型:

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

以及像这样的 POST 操作:

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

现在您所要做的就是 POST requestId 参数而不是 req,默认模型绑定(bind)器将完成这项工作。

如果出于某种原因您想使用带有自定义构造函数的 View 模型,下面是自定义模型绑定(bind)器的示例:

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());

关于c# - 当我的 View 模型有构造函数时发布数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com