如何将完整的视图模型提交到其他视图?

时间:2011-07-29 06:58:03

标签: asp.net-mvc submit viewmodel

我正在使用MVC3(razor),我正在努力让以下工作。

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

现在我正在尝试执行以下操作:

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

当我按下“添加”按钮时,我想将完整的视图模型(设置+翻译列表)提交到我可以填写翻译的其他页面。在我填写翻译后,我想返回此页面(网址:Screen)。在这里,翻译填写在列表中。

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

这是我的代码:

按钮'添加翻译':

@Html.ActionLink("Add", "CreateTranslation", new { oSnippeteditviewmodel = this.Model }, null)

SnippetController:

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);
} 

在控制器中,操作CreateTranslation对象'oSnippeteditviewmodel'保持为空。

有类似问题的annyone?还是一个解决方案?

2 个答案:

答案 0 :(得分:2)

首先,你应该尝试生成像这样的动作链接

@Html.ActionLink("Add", "CreateTranslation", this.Model, null)

在这种情况下,mvc将尝试为您的链接传递正确的序列化模型值,如果您的模型足够简单,CreateTranslations将正确获取其模型。但是,我不这样做。生成的链接是静态的。如果用户在客户端更改Snippet值,该怎么办?在添加翻译时,所有更改的表单值都将丢失(链接将传递初始的,服务器生成的值)。所以,你应该尝试以下之一

  1. 使用两个按钮创建表单,一个用于CratingTranslation,另一个用于保存。创建翻译时,动态更改表单的操作和方法参数以获取CreateTranslation操作。这样,表单将序列化其所有当前的Snippet设置并传递给所需的操作,并将当前的片段模型传递给CreateTranslation操作。
  2. 使用ajax。只需将翻译创建输入字段动态注入同一页面。这很简单,用户友好(没有导航捆绑),保留了更多的http流量(将所有翻译和代码段传递到第二页,然后返回所有这些+ 1翻译可能会让您遇到麻烦)。我会推荐这种方法。这比第一次或你的方法简单得多。

答案 1 :(得分:0)

我没有得到你的正确但如果你想通过“创建”控制器添加数据,那么你不需要在“oSnippeteditviewmodel”中指定对象。您可以通过

获取所有表单数据

Request.Form [“controlName”]

并按上面填写Snippeteditviewmodel数据成员并保存。