ASP.NET MVC 3是用于在.NET框架中开发Web应用程序的Model-View-Controller扩展的第三个主要版本。
有没有办法确定视图是否渲染为部分视图? 我希望通过捕捉这个来扩展我正在编写的部分的重用......并且如果需要的话分配适当的布局t......
首先,我在“视图”>“博客”>“显示模板”中有一个显示模板: @model Domain.Model.BlogPost @Html.ActionLink(Model.Title, "post", new { Id = Model.PostID }... 首先,我在“视图”>“博客”>“显示模板”中有一个显示模板: @model Domain.Model.BlogPost <div class="blogSummary"> @Html.ActionLink(Model.Title, "post", new { Id = Model.PostID }, new { @class = "titleLink" }) <div class="subInfo"> Posted by @Model.Author on @Model.PostedDate.ToString("D") | @Model.PostComments.Count Comment(s)</div> <br /> <div class="summaryText"> @Html.Markdown(Model.Body.Length > 300 ? Model.Body.Remove(0, 300) + "..." : Model.Body) @Html.ActionLink("(view more)", "post", new { Id = Model.PostID }) </div> </div> 那么我有一个看法: @model IEnumerable<Domain.Model.BlogPost> @{ ViewBag.Title = "Index"; } @Html.DisplayFor(x => x, "BlogPostSummary") 但是,我在 DisplayFor(): 上遇到错误 模型项传入 字典的类型是 'System.Data.Objects.ObjectSet`1[Domain.Model.BlogPost]', 但这本词典需要一个模型 类型为“Domain.Model.BlogPost”的项目。 我有点难以理解发生了什么。使用显示模板的最佳方式是什么? 问题是您正在尝试传递一组 BlogPost,而需要的是单个 BlogPost。 尝试: @Html.DisplayFor(x => x[0], "BlogPostSummary") 或者类似的东西: @foreach (var post in Model) @Html.Display(post) 注意:我不相信第二个示例是否正确使用了 Html.Display。我怀疑使用部分代码而不是显示模板会更好。 UI提示 默认情况下,ASP.NET MVC 依赖命名约定将类链接到 BlogPost.cshtml 显示模板。但是,如果您想使用 CustomBlogPost.cshtml 作为显示模板,则可以通过应用 BlogPost 属性来实现。 UIHint 也许可以试试这个 public class DomainModel { [UIHint("CustomBlogPost")] public BlogPost Post { get; set; } } 我一直在研究同样的问题,我想我有更好的解决方案给你。 您可以循环遍历集合,并且仍然可以正常工作: @Html.DisplayFor(x => x.First(), "BlogPostSummary") 在 lambda 表达式的左侧使用变量并不一定要求您也在右侧使用它。 @foreach(var blogPost in Model) { Html.DisplayFor(x => blogPost, "BlogPostSummary") } 期待 DisplayFor。 TModel 是模型的类型,例如 Expression<Func<TModel, TValue>>,但 TValue 可以是您喜欢的任何类型。 因此,只要您拥有对集合中当前项目的引用(如上面的 foreach 所示),您就可以忽略 lambda 表达式的左侧。 (但是你必须拥有 TModel。IEnumerable<BlogPost>不起作用。) 基本上是因为执行 Html.DisplayFor(() => blogPost, "BlogPostSummary") 隐式告诉 MVC 要传递的模型是传递视图的模型,即 @Html.DisplayFor() 您需要做的是枚举模型,并显示每个模型: IEnumerable<Domain.Model.BlogPost> 确保 BlogPostSummary 位于正确的文件夹中,然后就可以开始了! Necro'ing 抱歉:只是添加一个答案,因为这些都没有使用请求者询问的自动 ID。问题是您正在使用命名模板调用 DisplayTemplate 帮助程序。由于某些未知原因,ASP .Net 和 ASP .Net Core 在指定模板名称时禁用自动名称和 ID 处理。您应该将显示模板重命名为 @foreach(var blogPost in Model){ Html.RenderPartial("BlogPostSummary", blogPost) } 并从调用站点中删除 /Views/Shared/DisplayTemplates/BlogPost.cshtml。所以: 模板BlogPostSummary/Views/Shared/DisplayTemplates/BlogPost.cshtml 无论您在何处尝试引用它: @model Domain.Model.BlogPost <div class="blogSummary"> @Html.ActionLink(Model.Title, "post", new { Id = Model.PostID }, new { @class = "titleLink" }) <div class="subInfo"> Posted by @Model.Author on @Model.PostedDate.ToString("D") | @Model.PostComments.Count Comment(s)</div> <br /> <div class="summaryText"> @Html.Markdown(Model.Body.Length > 300 ? Model.Body.Remove(0, 300) + "..." : Model.Body) @Html.ActionLink("(view more)", "post", new { Id = Model.PostID }) </div> </div>
我打开了编译视图,并且刚刚更改了项目的很大一部分,因此一些视图目前不相关。 我右键单击它们并选择从项目中排除。
如何使用 jQuery 设置 ASP.NET MVC 生成的输入元素的值?
我有一个输入文本是这样的: @Html.LabelFor(model => model.EmployeeId, "员工编号") 我有一个输入文本是这样的: <div class="editor-label"> @Html.LabelFor(model => model.EmployeeId, "Employee Number") </div> <div class="editor-field textBoxEmployeeNumber"> @Html.EditorFor(model => model.EmployeeId) @Html.ValidationMessageFor(model => model.EmployeeId) </div> 生成以下html <div class="editor-label"> <label for="EmployeeId">Employee Number</label> </div> <div class="editor-field textBoxEmployeeNumber"> <input class="text-box single-line" data-val="true" data-val-number="The field EmployeeId must be a number." data-val-required="The EmployeeId field is required." id="EmployeeId" name="EmployeeId" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="EmployeeId" data-valmsg-replace="true"></span> </div> 我想使用 jquery 设置此输入文本的值,所以我这样做了: <script type="text/javascript" language="javascript"> $(function() { $('.textBoxEmployeeNumber').val("fgg"); }); </script> 但是,它不起作用...我的语法有什么错误? 您的选择器正在检索文本框周围的 <div class='textBoxEmployeeNumber'> 而不是其中的输入。 // Access the input inside the div with this selector: $(function () { $('.textBoxEmployeeNumber input').val("fgg"); }); 看到输出 HTML 后更新 如果 ASP.NET 代码可靠地输出带有 id 属性 <input> 的 HTML id='EmployeeId',您可以更简单地使用: $(function () { $('#EmployeeId').val("fgg"); }); 如果失败,您将需要在浏览器的错误控制台中验证是否存在导致此失败的其他脚本错误。 上面的第一个示例 在此演示中工作正常。 使用jQuery,我们可以使用以下代码: 输入名称选择: $('input[name="textboxname"]').val('some value') 按输入类别选择: $('input[type=text].textboxclass').val('some value') 通过输入id选择: $('#textboxid').val('some value') $(document).ready(function () { $('#EmployeeId').val("fgg"); //Or $('.textBoxEmployeeNumber > input').val("fgg"); //Or $('.textBoxEmployeeNumber').find('input').val("fgg"); }); 对于具有 id 的元素 <input id="id_input_text16" type="text" placeholder="Ender Data"></input> 您可以将值设置为 $("#id_input_text16").val("testValue"); 文档这里。 这是上课用的 $('.nameofdiv').val('we are developers'); 对于ID $('#nameofdiv').val('we are developers'); 现在如果你有一个可以使用的表单输入 $("#form li.name input.name_val").val('we are awsome developers'); 这是文件上传的另一种变体,它具有比默认文件上传浏览按钮更好看的引导按钮。 这是html: <div class="form-group"> @Html.LabelFor(model => model.FileName, htmlAttributes: new { @class = "col-md-2 control-label" }) <div class="col-md-1 btn btn-sn btn-primary" id="browseButton" onclick="$(this).parent().find('input[type=file]').click();">browse</div> <div class="col-md-7"> <input id="fileSpace" name="uploaded_file" type="file" style="display: none;"> @*style="display: none;"*@ @Html.EditorFor(model => model.FileName, new { htmlAttributes = new { @class = "form-control", @id = "modelField"} }) @Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" }) </div> </div> 这是脚本: $('#fileSpace').on("change", function () { $("#modelField").val($('input[name="uploaded_file"]').val()); 纯js会更简单 EmployeeId.value = 'fgg'; EmployeeId.value = 'fgg'; <div class="editor-label"> <label for="EmployeeId">Employee Number</label> </div> <div class="editor-field textBoxEmployeeNumber"> <input class="text-box single-line" data-val="true" data-val-number="The field EmployeeId must be a number." data-val-required="The EmployeeId field is required." id="EmployeeId" name="EmployeeId" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="EmployeeId" data-valmsg-replace="true"></span> </div>
IIS7和Crystal Reports 11频繁的应用程序池回收
我正在 IIS 上运行并嵌入 Crystal Reports 11 应用程序。 我正在使用 ASP.NET MVC 3 和 IIS7。 我有一个用户单击的按钮,它使用 Crystal Reports eng 生成大约 40 个 .pdf 文件...
此问题与 ASP.NET MVC 中的部分视图内执行 Javascript 中描述的问题类似 index.cshtml 中的以下代码运行正常... 此问题类似于 在 ASP.NET MVC 中的部分视图内执行 Javascript 中描述的问题 index.cshtml 中的以下代码运行正常... <label for="locationOfSearch"> in :</label> @Html.TextBox("locationOfSearch") <input type="submit" value="Search" style="background-color:Green"/> @section JavaScript { <script type="text/javascript"> $(document).ready(function () { $("#locationOfSearch").autocomplete({ source: '@Url.Action("AutocompleteAsyncLocations")' }) }); </script> } 但是当我将上面的代码和相应的脚本文件复制并粘贴到另一个视图,然后在index.cshtml中如果我调用Html.Partial(新视图名称),自动完成功能不起作用... 请告诉我如何解决它而无需太多修改...... 您不能在局部视图中使用剖面。它们根本不起作用。因此,您必须将 @section JavaScript 保留在视图中,以便注册脚本,然后渲染仅包含标记的部分。您还可以编写自定义帮助器方法来实现此目的,如此答案所示。 部分视图需要引用所有脚本,即使您已经在母版/布局页面中引用了它。创建一个部分视图(例如:_Scripts.cshtml)并将所有脚本和样式表引用放入其中。然后在每个视图中调用这个局部视图: @Html.Partial("_Scripts") 我也面临着同样的问题,如果这个问题已经解决,请任何人帮忙解决。 我们将不胜感激。 Dev39
MVC3/Razor:cshtml.Execute()':找不到合适的方法来覆盖
我正在尝试使用 RazorViewEngine 将 MVC2 站点转换为 MVC3。 我使用此工具升级我的项目,并使用 Telerik 转换器工具将我的 .aspx 视图转换为 Razor。 Telerik 工具...
我有一个这样的模型: 公共部分类 ClassTime { 公共 int Id { 得到;放; } 公共 int ScheduleId { 获取;放; } 公共 System.TimeSpan StartClassTime { 获取;放; } 公开
这是我的网址 http://abc.domain.com/controller/action/
我想为 HtmlHelper 创建一个扩展方法,它允许我创建一个 LabelFor 属性,如果它是必填字段,则在其后面显示一个星号。我怎样才能做到这一点? 公共课 Foo { [
我正在使用 Visual Studio 2010(MVC3 Razor) 和 Windows 7 做一个 Web 项目。 我的默认浏览器是IE。当我运行该项目时,网站与 url 完美配合 http://localhost:498...
我知道什么时候可以使用静态类,但我的简单问题是: 当我们对具有静态类的代码进行单元测试时,是否存在大问题? 使用常规实例类更好吗? 那个...
我有一个 ASP.NET MVC 3 应用程序。该应用程序通过 jQuery 请求记录。 jQuery 回调控制器操作,以 JSON 格式返回结果。我还没能证明...
为什么需要 Json 请求行为? 如果我想将 HttpGet 请求限制在我的操作中,我可以使用 [HttpPost] 属性来装饰该操作 例子: [http邮报] 公共 JsonResult Foo() {...
我一直在兜圈子试图从外部网站提取元标记信息。我开始使用 XML 方法,但由于标签链接文档类型等,我的应用程序不断抛出错误...
带有自定义参数的Html.DropDownListFor()
我想在 HTML 帮助器中添加扩展方法来生成这样的选择和选项 安道尔... 我想在 HTML 帮助程序中添加扩展方法来生成这样的选择和选项 <select id="Country" name="Country"> <option data-domain="AN" value="1">Andorra</option> <option data-domain="UI" value="2">United Arab Emirates</option> <option data-domain="AF" value="3">Afghanistan</option> 选项有一个数据域属性,我可以这样使用它 @Html.DropDownListFor(m => m.Country, Model.CountryList) Model.CountryList 是国家/地区变量的数组 class Country { public String Text { get; set; } public String Value { get; set; } public String Domain { get; set; } } 请谁能给出解决方案 您可以在自定义帮助器方法的帮助下构建您的CustomDropdownListFor,如下所示: 自定义辅助方法: public static class CustomHelpers { public class CustomSelectItem : SelectListItem { public string Class { get; set; } public string Disabled { get; set; } public string SelectedValue { get; set; } } public static MvcHtmlString CustomDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<CustomSelectItem> list, string selectedValue, string optionLabel, object htmlAttributes = null) { if (expression == null) { throw new ArgumentNullException("expression"); } ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData); string name = ExpressionHelper.GetExpressionText((LambdaExpression)expression); return CustomDropdownList(htmlHelper, metadata, name, optionLabel, list, selectedValue, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } private static MvcHtmlString CustomDropdownList(this HtmlHelper htmlHelper, ModelMetadata metadata, string name, string optionLabel, IEnumerable<CustomSelectItem> list, string selectedValue, IDictionary<string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException("name"); } TagBuilder dropdown = new TagBuilder("select"); dropdown.Attributes.Add("name", fullName); dropdown.MergeAttribute("data-val", "true"); dropdown.MergeAttribute("data-val-required", "Mandatory field."); dropdown.MergeAttribute("data-val-number", "The field must be a number."); dropdown.MergeAttributes(htmlAttributes); //dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes)); dropdown.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); StringBuilder options = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) options.Append("<option value='" + String.Empty + "'>" + optionLabel + "</option>"); foreach (var item in list) { if (item.SelectedValue == "selected" && item.Disabled == "disabled") options.Append("<option value='" + item.Value + "' class='" + item.Class + "' selected='" + item.SelectedValue + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>"); else if (item.SelectedValue != "selected" && item.Disabled == "disabled") options.Append("<option value='" + item.Value + "' class='" + item.Class + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>"); else if (item.SelectedValue == "selected" && item.Disabled != "disabled") options.Append("<option value='" + item.Value + "' class='" + item.Class + "' selected='" + item.SelectedValue + "'>" + item.Text + "</option>"); else options.Append("<option value='" + item.Value + "' class='" + item.Class + "'>" + item.Text + "</option>"); } dropdown.InnerHtml = options.ToString(); return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal)); } } 视图(剃须刀): @Html.CustomDropdownListFor(m => m.PersonId, ViewBag.PersonData as List<CustomHelpers.CustomSelectItem>, null, "---- Select ----", new { name = "personId", id = "personId"}) @Html.ValidationMessageFor(m => m.PersonId, null , new { @class = "ValidationErrors" }) 标准 DropDownList/DropDownListFor 助手不支持此功能。如果您需要此类功能,则必须从头开始编写自定义 HTML 帮助程序。您可以查看这个示例。还有另一个。 方法: public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListCodeItem> selectList) { var select = new TagBuilder("select"); var options = ""; TagBuilder option; foreach (var item in selectList) { option = new TagBuilder("option"); option.MergeAttribute("value", item.Value.ToString()); option.MergeAttribute("data-domain", item.Code.ToString()); option.SetInnerText(item.Text); options += option.ToString(TagRenderMode.Normal) + "\n"; } select.MergeAttribute("data-val", "true"); select.MergeAttribute("data-val-required", "The field is required."); select.MergeAttribute("id", name); select.MergeAttribute("name", name); select.InnerHtml = options; return new MvcHtmlString(select.ToString(TagRenderMode.Normal)); } 致电: @Html.DropDownList("name" Model.OrganizationTypeList) 稍微重构 Murat 的答案 public static class MvcHelpers { public class CustomSelectItem : SelectListItem { public string Class { get; set; } } public static MvcHtmlString CustomDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<CustomSelectItem> list, string selectedValue, string optionLabel, object htmlAttributes = null) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var name = ExpressionHelper.GetExpressionText(expression); return CustomDropdownList(htmlHelper, metadata, name, optionLabel, list, selectedValue, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } private static MvcHtmlString CustomDropdownList(HtmlHelper htmlHelper, ModelMetadata metadata, string name, string optionLabel, IEnumerable<CustomSelectItem> list, string selectedValue, IDictionary<string, object> htmlAttributes) { var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (string.IsNullOrWhiteSpace(fullName)) { throw new ArgumentException("Name cannot be null or empty.", nameof(name)); } var dropdown = new TagBuilder("select") { Attributes = { { "name", fullName }, { "data-val", "true" }, { "data-val-required", "Mandatory field." }, { "data-val-number", "The field must be a number." } } }; dropdown.MergeAttributes(htmlAttributes); dropdown.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); var options = new StringBuilder(); if (!string.IsNullOrEmpty(optionLabel)) { options.Append($ "<option value=''>{optionLabel}</option>"); } foreach (var item in list) { options.Append(CreateOption(item)); } dropdown.InnerHtml = options.ToString(); return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal)); } private static string CreateOption(CustomSelectItem item) { var disabledAttribute = item.Disabled ? "disabled" : string.Empty; var selectedAttribute = item.Selected ? "selected" : string.Empty; return $"<option value='{item.Value}' class='{item.Class}' {disabledAttribute} {selectedAttribute}>{item.Text}</option>"; } }
刚刚使用分页列表插件将分页添加到我的视图中,我只能将一页的数据带回。如果您单击“下一步”或任何其他可用页码,页面将重新提交...
我正在使用WebGrid,我需要使用Ajax 在页面之间切换。 索引代码 <p>我正在使用 <pre><code>WebGrid</code></pre>,我需要使用 Ajax 在页面之间切换。</p> <p><strong>索引代码</strong></p> <pre><code><script src="../../Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script> <script src="../../Scripts/jquery-1.5.1.min.js" type="text/javascript"></script> @using (Ajax.BeginForm("GetGrid", new AjaxOptions() { UpdateTargetId = "Res" })) { <input type="text" /> <input type="submit" value="start" /> <div id="Res"> </div> } </code></pre> <p><strong>结果部分视图</strong></p> <pre><code>@model IEnumerable<MvcApplication1.Controllers.Model> <div id="grid2"> @{ var grid = new WebGrid(source:Model,rowsPerPage:6,ajaxUpdateContainerId: "grid2"); @grid.GetHtml(htmlAttributes: new { id = "grid2" }, columns: grid.Columns( grid.Column("Someting") )); } </div> </code></pre> <p><strong>控制器代码</strong></p> <pre><code> public class ABCController : Controller { // // GET: /ABC/ public ActionResult Index() { return View(); } public static List<Model> mo = new List<Model>(); [HttpPost] public ActionResult GetGrid() { for (int i = 0; i < 1000; i++) { mo.Add(new Model() { Someting = i.ToString() }); } return PartialView("Result", mo); } } public class Model { public string Someting { get; set; } } </code></pre> <p>这适用于首页,但其他页面没有任何反应。</p> </question> <answer tick="true" vote="1"> <p>几个小时后,我找不到一些对我有帮助的东西。我注意到我的页面链接的 html 代码。 页面链接 </p> <pre><code><a href="#" onclick="$('#grid2').load('/ABC/GetGrid?page=2&amp;__=635163360142144025 #grid2');">2</a> </code></pre> <p>所以我终于明白了它是如何工作的。我向我的控制器添加了一个<pre><code>ActioResult</code></pre>,如下所示:</p> <pre><code> [HttpGet] public ActionResult GetGrid(int page) { return PartialView("Result",mo); } </code></pre> <p>并且有效。我希望这对某些人有帮助</p> </answer> </body></html>
我想为网络网格自动生成行号,我可以使用下面的代码来做到这一点 grid.Column(标题:“行号”,格式:item => item.WebGrid.Rows.IndexOf(item) + 1), 问题...