如何将另一个控制器的视图和行为纳入"这个"控制器的观点?

时间:2016-07-15 18:33:11

标签: asp.net asp.net-mvc razor partial-views

我有一个jQueryUI选项卡式html页面,并且在其中一个选项卡的内容区域中,我提供了如下内容:

<div id="tabs-1ua">                           
    @RenderPage("~/Views/Admin/Create.cshtml")
</div>

Create.cshtml页面正确显示在我的选项卡中,但是当我创建用户(此视图是基本用户创建页面)并单击按钮时,没有任何反应。没有创建用户,也没有出现错误。 &#34;这&#34;带有选项卡的html位于不同的控制器中,该控制器没有任何模型关联。用户创建在AdminController中,相关方法如下所示:

public ActionResult Create()
{
    return View();
}

 [HttpPost]
public async Task<ActionResult> Create(CreateModel model)
{
  if (ModelState.IsValid)
  {
    AppUser user = new AppUser { UserName = model.Name, Email = model.Email};
     IdentityResult result = await UserManager.CreateAsync(user,
                    model.Password);

     if (result.Succeeded)
        {
           return RedirectToAction("Index");
        }
     else
        {
            AddErrorsFromResult(result);
         }

    }
            return View(model);
}

我在Post方法的开头放了一个断点,但是当我从其他页面访问创建页面时,它从未被点击过。

当我直接访问此页面并创建用户时,我会获得新创建和验证的预期行为。该模型如下:

  public class CreateModel
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Email { get; set; }
        [Required]
        public string Password { get; set; }
    }

Create.cshtml视图如下:

@model IdentityDevelopment.Models.CreateModel
@{ ViewBag.Title = "Create User";}
<h2>Create User</h2>
@Html.ValidationSummary(false)
@using (Html.BeginForm())
{
    <div class="form-group">
        <label>Name</label>
        @Html.TextBoxFor(x => x.Name, new { @class = "form-control" })
    </div>
    <div class="form-group">
        <label>Email</label>
        @Html.TextBoxFor(x => x.Email, new { @class = "form-control" })
    </div>
    <div class="form-group">
        <label>Password</label>
        @Html.PasswordFor(x => x.Password, new { @class = "form-control" })
    </div>
    <button type="submit" class="btn btn-primary">Create</button>
    @Html.ActionLink("Cancel", "Index", null, new { @class = "btn btn-default" })
}

我的问题是,我可以做我想做的事吗?如果是这样,我需要做哪些更改才能重用现有的可用代码?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以明确指定单击提交按钮时表单应发布的操作方法。

您可以使用此Html.BeginForm方法的重载来执行此操作。

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

所以更新你的创建视图。

@model IdentityDevelopment.Models.CreateModel
@using (Html.BeginForm("Create","Admin"))
{
   @Html.TextBoxFor(x => x.Name, new { @class = "form-control" })
   <button type="submit" class="btn btn-primary">Create</button>
}

现在您可以在其中包含此视图,它始终会发布到Admin/Create

答案 1 :(得分:0)

您应该将创建表单移动到局部视图中,然后可以使用RenderPartial进行渲染。然后在您的父html页面表单中,对定义create方法的局部视图控制器执行ajax发布。然后,您可以将部分逻辑集中到部分视图控制器中使用您喜欢的任何部分。