Asp.net mvc 如何将完整的viewmodel提交到其他视图?

Asp.net mvc 如何将完整的viewmodel提交到其他视图?,asp.net-mvc,submit,viewmodel,Asp.net Mvc,Submit,Viewmodel,我正在使用MVC3(razor),我正在努力使以下各项正常工作 我有一个片段列表。这些代码段具有一些常规设置,然后具有未知语言量的翻译 现在我试着做以下几点: 在代码段的“创建”页面(url:)上,我设置了常规设置。下面是一个已填写的翻译列表(开头为空)。当您按下“Opslan”按钮时,我希望表单保存常规设置和翻译列表 当我按下“添加”按钮时,我想将完整的viewmodel(设置+翻译列表)提交到另一个页面,在那里我可以填写翻译。填写翻译后,我想返回此页面(url:)。在这里,列表中填写了翻译

我正在使用MVC3(razor),我正在努力使以下各项正常工作

我有一个片段列表。这些代码段具有一些常规设置,然后具有未知语言量的翻译

现在我试着做以下几点:

在代码段的“创建”页面(url:)上,我设置了常规设置。下面是一个已填写的翻译列表(开头为空)。当您按下“Opslan”按钮时,我希望表单保存常规设置和翻译列表

当我按下“添加”按钮时,我想将完整的viewmodel(设置+翻译列表)提交到另一个页面,在那里我可以填写翻译。填写翻译后,我想返回此页面(url:)。在这里,列表中填写了翻译

现在我做错了,因为我无法让viewmodel提交到第2页

这是我的代码:

按钮“添加翻译”:

代码段控制器:

public ActionResult Create()
{
SnippetEditViewModel oItem=新的SnippetEditViewModel();
oItem.lSnippetsPerLanguage=新列表();
返回视图(oItem);
} 
[HttpPost]
公共操作结果创建(SnippetEditViewModel SnippetEditViewModel)
{
if(ModelState.IsValid)
{
Snippeteditviewmodel.Bookmark=Snippeteditviewmodel.Bookmark.Replace('''.'');
_reposippet.CreateSnippet(Snippeteditviewmodel);
返回操作(“索引”);
}
返回视图(视图模型);
}
公共操作结果CreateTransformation(SnippetEditViewModel oSnippeteditviewmodel)
{
返回视图(oSnippeteditviewmodel);
} 
在控制器中,对象“oSnippeteditviewmodel”保持为空


有谁有类似的问题?或者解决方案?

我没有正确地理解您,但是如果您想通过“创建”控制器添加数据,则不需要在“oSnippeteditviewmodel”中指定对象。您可以通过以下方式获取所有表单数据:

申请表格[“controlName”]


然后按上面的方法填充Snippeteditviewmodel数据成员并保存它。

首先,您应该尝试像这样生成操作链接

@Html.ActionLink("Add", "CreateTranslation", this.Model, null)
在这种情况下,mvc将尝试为链接传递正确的序列化模型值,如果您的模型足够简单,CreateTransformations将正确获取其模型。但是,我不会那样做。生成的链接是静态的。如果用户更改客户端的代码段值,该怎么办?在添加翻译时,所有更改的表单值都将丢失(链接将传递初始的、服务器生成的值)。因此,您应该尝试以下方法之一

  • 使用两个按钮创建表单,一个用于装箱翻译,另一个用于保存。创建转换时,动态更改表单的操作和方法参数以获得CreateTransform操作。这样,表单将序列化其所有当前代码段设置并传递给所需的操作,然后将当前代码段模型传递给CreateTransformation操作
  • 使用ajax。只需将翻译创建输入字段动态注入同一页面即可。这很简单,用户更友好(没有导航包),并且保留了更多的http流量(将所有翻译和代码片段传递到第二页,然后返回所有这些+1翻译可能会给您带来麻烦)。我建议采用这种方法。这比第一种方法或您的方法简单得多

  • 向我们展示@Html.ActionLink生成的链接这是url:我调整了第一篇帖子,现在可能更容易理解:)你可以通过“ID”发送链接对象在其他页面上获取“翻译”,并通过ID从其他表单获取翻译数据。
    public ActionResult Create()
    {
        SnippetEditViewModel oItem = new SnippetEditViewModel();
        oItem.lSnippetsPerLanguage = new List<SnippetPerLanguageEditViewModel>();
        return View(oItem);
    } 
    
    [HttpPost]
    public ActionResult Create(SnippetEditViewModel Snippeteditviewmodel)
    {
        if (ModelState.IsValid)
        {
            Snippeteditviewmodel.Bookmark = Snippeteditviewmodel.Bookmark.Replace(' ', '_');
            _repoSnippet.CreateSnippet(Snippeteditviewmodel);
            return RedirectToAction("Index");  
        }
    
        return View(Snippeteditviewmodel);
    }
    
    public ActionResult CreateTranslation(SnippetEditViewModel oSnippeteditviewmodel)
    {
        return View(oSnippeteditviewmodel);
    } 
    
    @Html.ActionLink("Add", "CreateTranslation", this.Model, null)