Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我的视图模型具有构造函数时过帐数据不起作用_C#_Asp.net_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# 当我的视图模型具有构造函数时过帐数据不起作用

C# 当我的视图模型具有构造函数时过帐数据不起作用,c#,asp.net,asp.net-mvc,asp.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,我有以下代码: [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();
    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; 
    }
    ...
}
在这个新版本中,我有一个带有构造函数的视图模型

这一次,当我的表单被发回时,动作控制器永远不会被触发

有什么想法吗


谢谢。

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

通常您不需要这样的自定义构造函数。您可以简单地使用如下视图模型:

public class EditViewModel()
{
    public int RequestId { get; set; }
}
[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
    // some code here...
}
而后期动作是这样的:

public class EditViewModel()
{
    public int RequestId { get; set; }
}
[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
    // some code here...
}
现在您所要做的就是发布
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);
    }
}
它将在您的
应用程序\u Start
中注册:

ModelBinders.Binders.Add(typeof(EditViewModel), new EditViewModelBinder());
Asp.Net核心版本 您不再需要在startup.cs中注册任何内容。只需将活页夹指定给ViewModel,您就可以离开了

[ModelBinder(BinderType = typeof(EditViewModelBinder))]
public class EditViewModel

非常感谢您的准确回复。我之所以想将一些代码移动到视图模型的构造函数中,是为了使控制器尽可能轻。我有很多代码来“准备”我的视图模型,它“污染”了我的控制器。。。我的第一个想法是将其移动到视图模型的构造函数中。也许这不是个好主意。。。你怎么认为?无论如何,谢谢。@Bronzato我和你们一样有相同的要求,在vm的构造函数中传递一些对象,它应该封装如何处理它并设置它自己的属性。您是使用上述解决方案还是使用其他解决方案来解决此问题?我使用了上述建议的解决方案。现在您不需要
application\u Start
。只需通过属性执行此操作:
public ActionResult Edit([ModelBinder(typeof(EditViewModelBinder))]EditViewModel-viewModel)