在ASP.NET MVC形式张贴到另一个模型(Posting to another model fr

2019-08-17 04:48发布

如果我有了一个模型的视图,可以说汽车..

@model Project.Car

这个观点里面我想创建一个将数据发送到一个新的模型形式

    @using (Html.BeginForm("Add", "Controller"))
    {
        @Html.Hidden("ID", "1")
        @Html.Hidden("UserID", "44")
        @Html.TextArea("Description")
    }

我发现,如果我的行为与我的视图模型定义它不工作(模型总是空):

    [HttpPost]
    public PartialViewResult Add(ViewModels.NewModel model)

但是,如果我使用的FormCollection它的工作原理:

    [HttpPost]
    public PartialViewResult Add(FormCollection formCollection)

这里是视图模型:

public class NewModel
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public string Description { get; set; }
}

我的问题是,我可以从我的表单POST数据为newModel? 它坐落在观是正确的被束缚Project.Car。 它是一种小型化,需要发布不同的数据集有无关Project.Car在页面上。

Answer 1:

你有你的模型和动作名称之间的差异。 在这个例子中,你表现出的模式被称为Add ,而在你的行动,你正在使用ViewModels.NewModel 。 更糟的是,你的看法是强类型到一个叫做模型Car 。 凌乱的这一切。

因此,通过定义一个正确的视图模型开始:

public class CarViewModel
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public string Description { get; set; }
}

然后控制器:

public class CarsController: Controller
{
    public ActionResult Add()
    {
        var model = new CarViewModel
        {
            // don't ask me, those are the values you hardcoded in your view
            ID = 1,
            UserID = 44,
        };
        return View(model);
    }   

    [HttpPost]
    public PartialViewResult Add(CarViewModel model)
    {
        ...
    }
}

和相应的强类型以您的视图模型:

@model CarViewModel
@using (Html.BeginForm())
{
    @Html.HiddenFor(x => x.ID)
    @Html.HiddenFor(x => x.UserID)
    @Html.TextAreaFor(x => x.Description)
    <button type="submit">Add</button>
}


Answer 2:

My question is can I post data to NewModel from my form? 

简短的回答是肯定的,你可以将表单张贴到相关的应用程序中的任何型号的任何控制器上的任何控制器动作。

例如,对于您的形式张贴到“ Add上”动作NewModel控制器:

@using (Html.BeginForm("Add", "NewModel"))
    {
        @Html.Hidden("ID", "1")
        @Html.Hidden("UserID", "44")
        @Html.TextArea("Description")
    }

由于您的看法是强类型的,以你的Car模型,你可以改变这一点,发送到视图模型,其类型模型的更新相匹配(如您的看法达林证明 ),或者你需要的数据后,从地图CarNewModel在你的控制器:

CarControllerAdd操作(POST):

[HttpPost]
public PartialViewResult Add(Car model)
{
    //now map attribute values from the Car model onto 
    //corresponding attributes of an instance of NewModel
    NewModel new = new NewModel();
    new.ID = model.ID;
    new.UserID = model.UserID;
    new.Desc = model.Description;
    //etc...

    //update your model/db
    _db.Add(new);

    //Redirect however you wish...
}

此外,检查出AutoMapper ,对象对对象的映射器,它能够自动的ViewModels映射到模型,反之亦然。



Answer 3:

是的,你可以强烈地输入一个以一个模型,并邮寄到另一种模式。

这样做有两个选项:

  1. 手动为每个输入字段提供正确的名称,以便默认粘合剂会理解并创建模型( 例如 )。

    虽然这个工作,这也意味着你必须保持对错别字的眼睛,如果你拼错了属性名,你不会得到任何编译时错误。

  2. 手动创建绑定到新的模式类型视图中的HTML帮手。 然后,它会妥善为您生成HTML。

    为了构建帮手,你需要一个包装对象,那样会暴露你的模型实例的形式IViewDataContainer接口。 你可以在任何地方定义的包装,包括模型本身:

     public class NewModel { public int ID { get; set; } public int UserID { get; set; } public string Description { get; set; } public class WrapperForHtmlHelper : System.Web.Mvc.IViewDataContainer { public System.Web.Mvc.ViewDataDictionary ViewData { get; set; } public WrapperForHtmlHelper(NewModel value) { this.ViewData = new System.Web.Mvc.ViewDataDictionary<NewModel>(value); } } } 

    然后在视图中创建绑定到实例的帮手NewModel

     var ModelToPost = new YourApp.Models.NewModel() { ID = 1, UserID = 43, Description = "" } var hlp = new HtmlHelper<YourApp.Models.NewModel> (this.ViewContext, new YourApp.Models.NewModel.WrapperForHtmlHelper(ModelToPost) ); 

    然后你使用助手像往常一样:

     @hlp.HiddenFor(m => m.ID) @hlp.HiddenFor(m => m.UserID) @hlp.TextAreaFor(m => m.Description) 

    然后你PartialViewResult Add(ViewModels.NewModel model)将正确地接收数据。



Answer 4:

您的视图设置为使用类型的模型Project.Car 但是你的动作方法需要类型的模型ViewModels.NewModel也是你的模型类贴的类型是Add

改变他们的所有匹配(假设Add是正确的):

视图:

@model Add

控制器:

[HttpPost]
public PartialViewResult Add(Add model)


Answer 5:

您也可以为此创建一个自定义模型粘合剂。



文章来源: Posting to another model from a form in ASP.NET MVC