两个Controller Action(共享相同型号)使用相同的View

时间:2012-06-28 02:09:27

标签: asp.net-mvc-3

我有两个控制器动作都共享相同的模型。我可以在同一个视图中返回它们吗?

原因是我需要在一个视图中显示2个类别。一个类别显示所有用户的IN角色,另一个类别显示用户NOT IN角色。

想知道我该怎么做?任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

肯定是的。您可以为控制器中的不同操作设置相同的模型和视图。在这里,我将向您展示如何为创建编辑操作创建一个视图。

两个操作的

1 模型

public class CreateEditModel
{
    public CreateEditViewMode Mode { get; set; }
    public string AnOtherProperty { get; set; }
}

public enum CreateEditViewMode { Create, Edit }

Mode的属性CreateEditModel将帮助我们自定义每个操作的视图。

操作

    public ActionResult Create()
    {
        Models.CreateEditModel model = new Models.CreateEditModel();
        model.Mode = Models.CreateEditViewMode.Create;
        //Manipulate model
        return View("CreateEdit", model);
    }

    [HttpPost]
    public ActionResult Create(FormCollection collection)
    {
        // TODO: Add insert logic here
        return RedirectToAction("Index");
    }

    public ActionResult Edit(int id)
    {
        Models.CreateEditModel model = new Models.CreateEditModel();
        model.Mode = Models.CreateEditViewMode.Edit;
        //Manipulate model
        return View("CreateEdit", model);
    }


    [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {
        // TODO: Add update logic here
        return RedirectToAction("Index");
    }

注意我们如何在model.Mode行动中指定[HttpGet]:  1.我们可以自定义视图。  2.可以将视图发回适当的[HttpPost]操作。

两个操作

1 查看

@using MvcApplication1.Models
@model MvcApplication1.Models.CreateEditModel
@{
    ViewBag.Title = @Model.Mode.ToString();
}

<h2>@Model.Mode.ToString()</h2>

@using (Html.BeginForm(Model.Mode.ToString(), "Home"))
{
   <input type="submit"
          value="@(Model.Mode == CreateEditViewMode.Create ? "Create" : "Update")" />
}

棘手的部分是使用以下overload of FormExtensions.BeginForm() Method

  public static MvcForm BeginForm(
      this HtmlHelper htmlHelper,
      string actionName,
      string controllerName
  )

答案 1 :(得分:0)

如果我已正确理解您的问题,您希望一个视图显示两个不同的用户列表:给定角色的用户列表,以及另一个不属于给定角色的用户列表。

这完全有可能 - 使用ViewModel的概念。您创建一个包含视图所需的所有不同属性的类,并将其用作视图的模型。修改您的控制器操作以设置所有必要的属性

e.g。

ViewModel

public class UserListViewModel
{
   public string Role { get; set; }
   public List<User> UsersInRole { get; set; }
   public List<User> UsersNotInRole  { get; set; }
}

控制器动作

public ActionResult ShowRoleDetails ( string role ) {

    var model = new UserListViewModel();

    model.Role = role;
    model.UsersInRole = //some code to get users in the given role
    model.UsersNotInRole  = //some code to get users not in the given role

    return View(model);
}

视图

@model ViewModel
...

<h1>Users in @Model.Role</h1>
@foreach (var user in Model.UsersInRole)
{
   <p>@user.Name
}

<h1>Users not in @Model.Role</h1>
@foreach (var user in Model.UsersNotInRole)
{
   <p>@user.Name
}