我有以下代码:
[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...
}
Run Code Online (Sandbox Code Playgroud)
它工作正常:当发布编辑表单时,我有被调用的动作控制器.
现在我修改一些像我这样的代码:
[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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
在这个新版本中,我有一个带有构造函数的视图模型.
这次,当我的表单被回发时,动作控制器永远不会被触发.
任何的想法?
谢谢.
Dar*_*rov 19
这很正常.默认模型绑定器无法再实例化视图模型,因为它没有无参数构造函数.如果要使用没有默认构造函数的视图模型,则必须编写自定义模型绑定器.
通常,您不需要这样的自定义构造函数.您可以简单地使用您的视图模型:
public class EditViewModel()
{
public int RequestId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和那样的POST动作:
[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
// some code here...
}
Run Code Online (Sandbox Code Playgroud)
现在你所要做的就是POST requestId
参数而不是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);
}
}
Run Code Online (Sandbox Code Playgroud)
将在您的注册Application_Start
:
ModelBinders.Binders.Add(typeof(EditViewModel), new EditViewModelBinder());
Run Code Online (Sandbox Code Playgroud)
public class EditViewModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var req = bindingContext.ValueProvider.GetValue("req");
if (req == ValueProviderResult.None || string.IsNullOrEmpty(req.FirstValue))
{
bindingContext.ModelState.TryAddModelError("req", "Missing req parameter");
}
int reqValue;
if (!int.TryParse(req.AttemptedValue, out reqValue))
{
bindingContext.ModelState.TryAddModelError($"The req parameter contains an invalid value: {req.AttemptedValue}");
}
var model = new EditViewModel(req.FirstValue);
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
您不再需要向startup.cs 注册任何内容。只需将活页夹分配给您的 ViewModel 即可。
[ModelBinder(BinderType = typeof(EditViewModelBinder))]
public class EditViewModel
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8210 次 |
最近记录: |