如何将另一个控制器的视图和行为合并到 "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
我有一个 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