我正在尝试通过查看示例应用程序来更好地学习Rails,并且在查看railscasts.com源代码的这一行时,我注意到它是这样做的:
<div class="episodes">
<%= render @episodes %>
</div>
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?为什么渲染函数没有记录?或者是吗?
我有一个视图模型,其中包含其他对象的集合.
public ParentViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<ChildViewModel> Child { get; set; }
}
public ChildViewModel
{
public int Id { get; set; }
public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的一个视图中,我将ParentViewModel作为模型传递,然后使用
<%: Html.EditorFor(x => x) %>
Run Code Online (Sandbox Code Playgroud)
其中显示Id和Name属性的表单.
当用户单击一个按钮时,我通过Ajax调用一个动作来加载一个局部视图,该视图带有一个Child的集合:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Child>>" %>
<%: Html.EditorFor(x => x) %>
Run Code Online (Sandbox Code Playgroud)
然后使用自定义模板Child显示传入的每个子项的表单.
我遇到的问题是由Child自定义模板创建的表单不使用DefaultModelBinder使用的命名约定.
即字段名称(由Ajax加载时):
[0].FirstName
Run Code Online (Sandbox Code Playgroud)
代替:
Child[0].FirstName
Run Code Online (Sandbox Code Playgroud)
所以我的控制器中的编辑操作:
[HttpPost]
public virtual ActionResult Edit(int id, FormCollection formValues)
{
ParentViewModel parent …Run Code Online (Sandbox Code Playgroud) 我有一个简单的电子邮件捕获表单作为我的主页的一部分,但是当我返回部分视图时,表单的编辑器的模型值没有得到更新:
该模型
public class Contact
{
[Key]
public int Id { get; set; }
[Required]
public string Email { get; set; }
[NotMapped]
public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
观点
@model TestApp.Models.Contact
@{
ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.form.js")" type="text/javascript"></script>
<script type="text/javascript" >
$(function () {
// ajax form post
$("#EmailForm").ajaxForm(function (result) {
$("#EmailForm").html(result); // post results
});
});
</script>
@using (@Html.BeginForm("SaveEmail", "Home", FormMethod.Post, new { id = "EmailForm" }))
{ …Run Code Online (Sandbox Code Playgroud) 嗨,我想尝试使用mvc 3来掌握ajax.beginform.
我有两个表单,一个HTML.BeginForm可以正常工作,一个Ajax.BeginForm在局部视图中.ajax表单的帖子是为模型添加注释.
问题是ajax提交是在主视图中提交包括HTML.BeginForm在内的整个页面而不是用note来执行异步帖子.
谁能看到我做错了什么?
我看了其他问题,并在web.config等中禁用了不显眼的javascript.
视图:
<div id="maincontent">
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Edit Franchise</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FirstLine)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstLine)
@Html.ValidationMessageFor(model => model.FirstLine)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SecondLine)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.SecondLine)
@Html.ValidationMessageFor(model => model.SecondLine)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.City)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.City)
@Html.ValidationMessageFor(model => model.City)
</div>
<div class="editor-label">
@Html.LabelFor(model => …Run Code Online (Sandbox Code Playgroud) 我有一个MVC 3 Razor项目.它有一个叫Admin的区域.我在项目的Views/Shared文件夹中具有页面的基本布局(默认情况下).我在主项目中有一个名为Common的控制器.它将负责布局的某些部分,这些部分基于业务逻辑(基于角色的导航等).我有
@Html.Action("Navigation", "Common")
在_layout.cshtml文件中调用.这被设置为渲染导航栏.当我转到管理区域中的路由("admin/somedomainobject/add")时,运行时错误指出以下内容:
"路径控制器"/ admin/somedomainobject/add"未找到或未实现IController."
当我从布局中删除线条时,它存在很好.如果我使用上述语法或以下语法,则会发生错误:
@{Html.RenderAction("Naviation", "Common");}
Run Code Online (Sandbox Code Playgroud)
是因为我在使用区域吗?我是否以错误的方式使用主项目文件夹?
任何想法将不胜感激!
我想在我的共享布局模板中包含一个部分视图.此部分视图也有自己的控制器和模型,例如
_MyPartialView.cs
@model MyModelClass
..一些代码.. @ Model.SomeProperty
PartialController.cs
public PartialViewResult RenderMyPartial()
{
var model = new MyModelClass();
model.Initialize();
return PartialView("_MyPartialView", model);
}
Run Code Online (Sandbox Code Playgroud)
_Layout(共享布局)
@ Html.Action("RenderMyPartial","PartialController")
这里的意图是布局页面将调用PartialController,它将消失并填充模型并返回部分视图,该部分视图将绑定到此模型并在共享布局主模板中呈现.
但是当我运行它时,我收到以下错误:
未找到路径'/ XXX /'的控制器或未实现IController.
我已经环顾四周,但很惊讶这似乎不是一个非常常见的设计模式,并想知道为什么?有任何想法吗?
谢谢邓肯
我在该布局中有一个布局页面我使用了局部视图,局部视图包含我已经构建的菜单功能,我将菜单拆分为局部视图以确保它易于维护.菜单特意放置在布局中,因为它用于每个页面,但菜单中有条件元素,某些选项仅出现在某些页面上.
我偶然发现了将来会出现什么问题,菜单使用ajax调用来呈现包含内容的部分视图(减少页面加载)我只是在一个包含公司的页面上工作,该公司包含一个联系人列表,单击时的菜单选项应显示联系人列表.我已经在公司模型下加载了联系人列表,但是!我无法从应该呈现联系人列表的新部分视图中访问它,因为菜单是布局页面中包含的部分视图,因此无法接受模型,因此我无法将模型传递到局部视图中我正在尝试加载,因为菜单部分视图位于布局页面中.
这是一个棘手的情况,我显然可以更改布局以呈现一个新的部分来包含菜单,这样我就可以将新的视图模型传递给它,但是我构建的每一个页面都需要引用菜单(这是什么害虫!)我必须在这里遗漏一些东西(考虑到这是我可能的第一个MVC3应用程序).有什么建议?
编辑:我自己更进一步,简而言之,我的布局页面将始终能够访问使用它的页面模型,因此包含菜单的部分视图也可以访问该数据.我在菜单部分视图中编写了一些条件逻辑,用于检查页面,然后根据需要传入数据.
<div class="menu">
<ul>
<li><a href="@Url.Action("Create", "Contact")">New Contact </li>
<li><a href="@Url.Action("Index", "Contact")">Contact List </a></li>
</ul>
@if (Request.Url.PathAndQuery.Contains("/Contact/Details/"))
{
<ul>
<li>@Html.ActionLink("New Activity", "Create", "Activity", new { companyid = 0, contactid = Model.contact.id }, null)</li>
</ul>
}
</div>
Run Code Online (Sandbox Code Playgroud)
以上是菜单局部视图的一小部分示例,但包含一个示例,其中为联系人/详细信息页面构建菜单,并且能够传入model.contact.id.它的工作原理是我的菜单和我的布局没有明确地包含模型,但它感觉不是很整洁.
我是MVC3和C#的新手.
这是我目前的模特
@model Reports.ViewModels.ContentViewModel
<div>Total Hours: </div>
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好,然后我在这些局部视图中使用HTML,使用另一个@model呈现我想要的一切.问题是我想将所有数据添加到一起.
我想在foreach之外创建一个var foreach将数据插入var并在foreach完成后返回它,就像这样
@model Reports.ViewModels.ContentViewModel
@{var Total = 0}
foreach (var user in Model.Users.ToList()) {
@Html.Partial("_DirectReports", user)
//@Total is assigned a value in the partial view
}
<div>Total Hours: @Total</div>
Run Code Online (Sandbox Code Playgroud)
如果这是可能的那将是伟大的thks
所以,我正在创建一个管理页面,我想在其上放置多个表单.所以,我尝试使用Partial View和RenderAction来完成它.
我的管理员索引视图:
@model Rad.ViewModels.AdminViewModel
@{
ViewBag.Title = "Admin";
}
<h2>Admin</h2>
<div>
@{ Html.RenderAction("AddProduct"); }
</div>
Run Code Online (Sandbox Code Playgroud)
我的部分观点:
@model Rad.ViewModels.AdminAddProductViewModel
@using (Html.BeginForm("AddProduct", "Admin"))
{
<h1>@Html.LabelFor(model => model.Name)</h1>
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
<input type="submit" value="Add"/>
}
Run Code Online (Sandbox Code Playgroud)
我的管理控制器:
public class AdminController : Controller
{
//
// GET: /Admin/
public ActionResult Index()
{
return View();
}
public ActionResult AddProduct()
{
return PartialView();
}
[HttpPost]
public ActionResult AddProduct(AdminAddProductViewModel data)
{
if (ModelState.IsValid)
{
}
return View("Index");
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于AddProduct的HttpPost版本.如果我将它保持为返回视图("索引"),它将进入无限循环.但是,如果我返回PartialView(数据),它会正确显示错误,但没有围绕它的索引视图.因此,它只显示部分视图.有没有办法在一个页面上有多个表单并将服务器端验证返回到页面?
forms partial-views renderaction asp.net-mvc-3 asp.net-mvc-4
我的观点分为部分观点.因此,在提交时我的模型没有正确重建.
页面视图显示员工数据,其中Employee.Contactinfo是_contactInfo局部视图的模型,其中还具有部分视图_phoneInfo以呈现具有模型Employee.ContactInfo.PhoneInfo的电话信息.
现在的问题是属性的名称.渲染时的Employee.ContactInfo.PhoneInfo.Contact1名称为"Contact1",因此在提交时模型未正确创建,我获得了Employee的原始数据,但是像ContactInfo这样的复杂类型为null.
我认为解决方案是在渲染局部视图时添加前缀.如何在MVC 6中执行以下操作?
employee.cshtml
@model Employee
<% Html.RenderPartial("_conctactInfo", Model.ContactInfo, new ViewDataDictionary
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "ContactInfo" }
})
%>
Run Code Online (Sandbox Code Playgroud)
_contactInfo.cshtml
@model ContactInfo
<% Html.RenderPartial("_phoneInfo", Model.PhoneInfo, new ViewDataDictionary
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "PhoneInfo" }
})
%>
Run Code Online (Sandbox Code Playgroud)
_phoneInfo.cshtml
@model PhoneInfo
<input asp-for="@Model.Contact1" />
Run Code Online (Sandbox Code Playgroud) asp.net-mvc partial-views asp.net-mvc-partialview asp.net-core-mvc