如何将另一个控制器的视图和行为合并到 "this" 控制器的视图中?

How to incorporate another controller's view and behavior into "this" controller's view?

我有一个 jQueryUI 选项卡 html 页面,在其中一个选项卡的内容区域中,我输入如下:

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

Create.cshtml 页面在我的选项卡中正确显示,但是当我创建用户(此视图是基本用户创建页面)并单击按钮时,没有任何反应。没有创建用户,也没有出现错误。带有选项卡的 "this" 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" })
}

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

谢谢。

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

您可以明确指定在单击提交按钮时表单应该 post 到哪个操作方法。

您可以使用此 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>
}

现在无论您在哪里包含此视图,它总是 post 到 Admin/Create