Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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# ViewModel在post上丢失数据_C#_Asp.net_Asp.net Mvc_Entity Framework_Mvvm - Fatal编程技术网

C# ViewModel在post上丢失数据

C# ViewModel在post上丢失数据,c#,asp.net,asp.net-mvc,entity-framework,mvvm,C#,Asp.net,Asp.net Mvc,Entity Framework,Mvvm,我正在尝试创建一个复杂的ViewModel,它在公司的详细信息页面中同时具有索引页面和公司注释的创建页面,并希望获得一些关于我是否正确执行此操作的指导 我目前的问题是,当我创建一个新的公司便笺时,除了我在cshtml中包含的editor字段之外,对象中没有任何信息-它会丢失ViewModel中的所有数据。 我有一个公司模型和公司控制器,在我的详细信息操作中,我填充了所有与公司相关的注释,以及一个允许用户添加新注释的表单 我的公司和公司网络模式非常简单: public class Company

我正在尝试创建一个复杂的ViewModel,它在公司的详细信息页面中同时具有索引页面和公司注释的创建页面,并希望获得一些关于我是否正确执行此操作的指导

我目前的问题是,当我创建一个新的公司便笺时,除了我在cshtml中包含的editor字段之外,对象中没有任何信息-它会丢失ViewModel中的所有数据。

我有一个公司模型和公司控制器,在我的详细信息操作中,我填充了所有与公司相关的注释,以及一个允许用户添加新注释的表单

我的公司和公司网络模式非常简单:

public class Company
{
    public int CompanyID { get; set; }
    // bunch of fields related to the company

    public virtual ICollection<CompanyNote> CompanyNotes { get; set; }
}


public class CompanyNote
{
    public int CompanyNoteID { get; set; }
    public DateTime Date { get; set; }
    public string Note { get; set; }

    public Company Company { get; set; }
}
这是我在公司控制器中的CreateNote操作。(我是否应该将其拆分为单独的部分视图?有什么好处?)

最后,这里是detail.cshtml的简化版本:

@model Project.ViewModels.CompanyViewModel

// My company detail display is here, removed for sake of berevity 
@using (Html.BeginForm("CreateNote", "Company"))
{

    @Html.EditorFor(model => model.CompanyNote.Date)
    @Html.TextAreaFor(model => model.CompanyNote.Note})
    <input type="submit" value="Create" />
}
@model Project.ViewModels.CompanyViewModel
//我公司的详细信息显示在这里,为了方便起见,请删除
@使用(Html.BeginForm(“CreateNote”、“Company”))
{
@EditorFor(model=>model.CompanyNote.Date)
@Html.TextAreaFor(model=>model.CompanyNote.Note})
}
当我发布时,我的CreateNote操作有一个基本为空的companyViewModel,但companyViewModel.CompanyNote.Date和companyViewModel.CompanyNote.Note除外,它们是我表单中的字段-ViewModel中的所有其他数据都为空,因此我甚至不确定如何包含对母公司的引用

我在这条路上走对了吗

谢谢, 罗比

当我发布时,我的CreateNote操作有一个companyViewModel,即 基本上是空的,除了 companyViewModel.CompanyNote.Date和 companyViewModel.CompanyNote.Note,这是我表单中的字段- ViewModel中的所有其他数据都为null,因此我不确定如何 甚至包括对母公司的引用

这是完全正常的行为。提交表单时,只有作为输入字段包含在表单中的信息才会发送到服务器,这是您希望model binder能够检索到的唯一信息

如果您在HttpPost操作中需要CompanyNotes集合,只需查询您的后端,就像在GET操作中一样。可以通过将公司ID作为隐藏字段传递来完成此操作:

@Html.HiddenFor(model => model.Company.CompanyID)
因此,我们的想法是在表单中只包含用户应该以某种方式修改的信息作为输入字段。对于所有其他信息,您的后端已经有了它,所以您所要做的就是点击它来获取它


与经典的WebForms相反,ASP.NET MVC中不再有任何ViewState的概念。它更接近HTTP协议的无状态性质。

Darin,谢谢,这是有道理的,但在我的帖子中,我必须根据ID再次查找公司,并使用company company=db.companys.Find(ID),然后将company添加到Companynote,这似乎是一个不必要的数据库调用,这是普遍接受的实现我想要做的事情的方式吗?我是否应该使用局部视图(大多数示例似乎都是这样!)是的,如果需要检索公司笔记集,应该访问数据库。至于你关于部分观点的问题,我不太明白这和这里的问题有什么关系。
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateNote(CompanyViewModel companyViewModel)
    {
        CompanyNote companyNote = companyViewModel.CompanyNote;

        if (ModelState.IsValid)
        {

            db.CompanyNotes.Add(companyNote);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(companyViewModel);

    }
@model Project.ViewModels.CompanyViewModel

// My company detail display is here, removed for sake of berevity 
@using (Html.BeginForm("CreateNote", "Company"))
{

    @Html.EditorFor(model => model.CompanyNote.Date)
    @Html.TextAreaFor(model => model.CompanyNote.Note})
    <input type="submit" value="Create" />
}
@Html.HiddenFor(model => model.Company.CompanyID)