Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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/9/git/24.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# MVC自定义视图模型问题_C#_Asp.net Mvc_Viewmodel - Fatal编程技术网

C# MVC自定义视图模型问题

C# MVC自定义视图模型问题,c#,asp.net-mvc,viewmodel,C#,Asp.net Mvc,Viewmodel,我是一个MVC新手,所以你必须原谅我想象中的一个基本问题 我创建了一个自定义viewmodel,以便在我的表单中有一个多选列表: public class CustomerFormViewModel { public Customer Customer { get; private set; } public MultiSelectList CustomerType { get; private set; } public CustomerFormViewModel(C

我是一个MVC新手,所以你必须原谅我想象中的一个基本问题

我创建了一个自定义viewmodel,以便在我的表单中有一个多选列表:

public class CustomerFormViewModel
{
    public Customer Customer { get; private set; }
    public MultiSelectList CustomerType { get; private set; }

    public CustomerFormViewModel(Customer customer)
    {
        Customer = customer
        // this returns a MultiSelectList:
        CustomerType = CustomerOptions.Get_CustomerTypes(null);
    }
}
我发现我的第一次尝试只捕获了multiselect的第一个值,我猜这是因为我的创建操作如下所示:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Customer customer) { ... }
<%@  Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MySite.Controllers.CustomerFormViewModel>" %>
...
<% using (Html.BeginForm())
    <%= Html.ListBox("CustomerType", Model.CustomerType)%>
...
因此,我决定将其改为:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(CustomerFormViewModel model) { ... }
这样我就可以从MultiSelectList中获得完整的输出并相应地解析它。问题是,这抱怨viewmodel没有无参数构造函数(而且没有),我不确定解决这个问题的正确方法。我试过的都没用,我真的需要一些帮助

如果有帮助,我的观点如下:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Customer customer) { ... }
<%@  Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MySite.Controllers.CustomerFormViewModel>" %>
...
<% using (Html.BeginForm())
    <%= Html.ListBox("CustomerType", Model.CustomerType)%>
...

...

您是否尝试过自定义ModelBinder。我不确定我是否清楚地理解了您的代码,但这可能是您的出发点:

public class CustomerFormViewModelBinder : DefaultModelBinder
{
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = new CustomerFormViewModel(customer)
    }
}
我相信我明白了:

public class CustomerModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var form = controllerContext.HttpContext.Request.Form;

        Customer customer = base.BindModel(controllerContext, bindingContext) as Customer;

        if (customer!= null)
        {
            customer.CustomerType= form["CustomerType"];
        }

        return customer;
    }
}
连同global.asax文件的应用程序_Start()中的一个条目:


这将在字段中放置列表框选择的逗号分隔列表。e、 g.“1,3,4”

已经做了一些研究,并得出结论——正如您所说——定制模型活页夹正是我所需要的。现在我只需要想出如何写一个!谢谢你的评论,我会采纳你的建议,看看我能不能让它发挥作用。