MVC4使用不同的视图模型生成创建表单

时间:2013-11-21 04:17:52

标签: forms asp.net-mvc-4 c#-4.0

首先,如果这是一个双重帖子,我的不好。我觉得我尽力去寻找这个,但我找不到它。

我要做的是创建一个快速的CMS编辑器。我有一个编辑器页面(PageViewModel类)然后,在这种情况下,使用该编辑器创建一个新页面(Page类)。

我一直试图通过“书”来讨论如何通过MVC 4中创建的表单提交数据,基本上,在添加视图并选择Create时,通过WYSIWYG编辑器。为了绑定字段集数据,它需要视图模型。我的问题是我不希望表单模型基于视图模型。在我的场景中,我有一个PageViewModel课程,我也有一个Page课程。只要知道PageViewModel是组合模式,它将Page与其他项组合在一起。

在这种情况下,我在任何地方都使用@model来生成内容,如:

<fieldset>
    <legend>Page</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Content)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Content)
        @Html.ValidationMessageFor(model => model.Content)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

如何让fieldset生成或引用@model以外的其他类类型,以便我可以使用不同的模型?

谢谢大家, 凯利

3 个答案:

答案 0 :(得分:2)

凯利,

在您的PageViewModel中,您可以拥有一个指向另一个ViewModel的属性,例如:

public class PageViewModel
{
    public Page Content { get; set; }
}

public class Page
{
    public int Id { get; set; }
    public string Foo { get; set; }
}

然后你可以为“PageViewModel”创建一个强类型视图,它将呈现一个名为“Page”的局部视图:

@model MvcApplication2.Models.PageViewModel

@{
    ViewBag.Title = "PageViewModel";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.Partial("Page",@Model.Content)

这是部分视图的代码,它也是强类型的:

@model MvcApplication2.Models.Page

<fieldset>
    <legend>Page</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Foo)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Foo)
        @Html.ValidationMessageFor(model => model.Foo)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

您也可以使用ViewData属性。在您的控制器中,您的代码将如下所示:

public ActionResult Index()
{
    Page page = new Page();
    ViewData.Add("Page", page);
    return View();
}

在您看来,它几乎是一样的:

@Html.Partial("Page", ViewData["Page"])

答案 1 :(得分:0)

创建一个使用新模型的不同视图,或使当前视图采用模型的基本版本,例如,其他两个模型继承的接口或抽象(虚拟)类。

似乎更新两个表单可能需要做很多工作,但是如果你认为这两个模型会有很大差异,那么现在将它们分开更容易,然后尝试在视图中维护很多if-then代码稍后的。如果它们相对相似,为什么不使用上面提到的方法,或者只使用相同的模型?

答案 2 :(得分:0)

看起来想法是,在您的视图中,您可以传递模型,该模型可以是包含其他类或所谓的ViewBag的任何类。 例如,在您的操作方法中,您可以填充模型并将其传递给视图

var model = new MyModel();
model.Text = "";

return View(model);

但是如果你需要传递别的东西而且更重要的是你不想在你的模型中包含它,那么使用ViewBag。 例如,我们传递标题。

ViewBag.Title = "My Page";

想法是viewBag是一个动态生成的对象,因此您可以向其添加任何属性,并在稍后的视图中使用它们。

@ViewBag.Title

因此,在提交表单后,您将只有包含用户文本的模型,而不是标题。