我们正在将ASP.NET MVC 1.0应用程序升级到2.0版本,而某些代码需要使用需要HtmlHelper呈现的LinkExtensions.虽然我们知道某些代码没有正确地遵循MVC模型并且正在根据需要进行重新编码,但我们需要一些工作来实现应用程序的构建.
这是我们在ASP.NET MVC 1.0下工作的当前语法:
public static HtmlHelper GetHtmlHelper(ControllerContext context)
{
return new HtmlHelper(new ViewContext(context,
new WebFormView("HtmlHelperView"),
new ViewDataDictionary(),
new TempDataDictionary()),
new ViewPage());
}
Run Code Online (Sandbox Code Playgroud)
我们得到的错误如下:
错误1'System.Web.Mvc.ViewContext'不包含带有4个参数的构造函数
我怎么能创建这样的东西:Html.MyApp.ActionLink()?谢谢.
场景
路线:/ template/customize/10其中:10 =模板的ID()
在控制器中,模型是基于模板创建的,因此View的模型实际上是一个Customization()对象,实际上Id为0,因为它是新的.
在视图中我渲染@ Html.HiddenFor(m => m.Id)并且隐藏输入的结果值是10,尽管它应该是0,因为m是Customization类型.我之前使用MVC 2遇到过这种情况,并且通过不使用辅助方法解决了这个问题.
问题
是否有注释或我可以添加到Html Helper方法以实际呈现正确的值?
这是一个错误(MVC似乎将m.Id渲染为路径值,而不管控制器中实际模型的设置是什么)?
附加代码澄清
视图
@model Project.Core.Domain.Customization
@using( Html.BeginForm( "save", "customization" ) )
{
@Html.HiddenFor( m => m.Id )
@Html.HiddenFor( m => m.Template.Id )
<button type="submit" id="save" name="save">Save</button>
}
Run Code Online (Sandbox Code Playgroud)
调节器
public ActionResult Customize( int id )
{
var template = Persistence.Data.RetrieveObject<Template>( id );
var model = new Customization();
ViewBag.Template = template;
return ( View( model ) );
}
Run Code Online (Sandbox Code Playgroud)
解
将Action的签名更改为:
public ActionResult Customize( int TemplateId …Run Code Online (Sandbox Code Playgroud) 我有一个View,我将产品添加到一个简单的WebStore.我希望一个产品有多个图像.这就是我使用Microsoft.Web.Helpers的FileUpload的原因.在我的View中使用FileUpload是这样的:
@FileUpload.GetHtml("Upload", 5, true, true, addText: "Add more", uploadText: "Upload files")
Run Code Online (Sandbox Code Playgroud)
然后我有一些其他产品属性的标签和字段,如下所示:
<div class="editor-field"><br>
@Html.EditorFor(model => model.Title)<br>
@Html.ValidationMessageFor(model => model.Title)<br>
</div>
Run Code Online (Sandbox Code Playgroud)
问题是当我使用post方法时,我的控制器没有得到任何东西.我使用这样的控制器:
[HttpPost]
public ActionResult Create(Product product, IEnumerable<HttpPostedFileBase> fileUpload)
{
foreach (var file in fileUpload)
{
var fileName = Path.GetFileName(file.FileName);
}
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
那么有谁知道我做错了什么.因为我的FileUpload对象总是空的.
在许多地方,您会听到开发人员谈论声明性HTML帮助程序或HTML帮助程序.他们的区别是什么?他们只是同义词吗?
我将编写一个包装Html.ActionLink的简单助手,并为其添加一个类属性.目前它看起来像:
@helper MyActionLink(string text, string action, object routeValues, object htmlAttributes)
{
@Html.ActionLink(text, action, routeValues, new { @class = "MyClass" })
}
Run Code Online (Sandbox Code Playgroud)
它实际上添加了所需的@class属性,但忽略了所有传递的属性htmlAttributes.所以,如果像使用一样
@MyActionLink("Item1", "Edit", new { itemId = 1 }, new { @class = "class1" })
Run Code Online (Sandbox Code Playgroud)
它输出
<a class="MyClass" href="/Test/Edit?itemId=1">Item1</a>
Run Code Online (Sandbox Code Playgroud)
但我希望它有2个类: class="class1 MyClass"
如何合并这些htmlAttributes?
我使用RouteValueDictionary将RouteValues传递给ActionLink:
如果我编码:
<%:Html.ActionLink(SharedResources.Shared_Pagination_First, Model.ActionToExecute, Model.ControllerToExecute, Model.FirstRouteValues, null)%>
Run Code Online (Sandbox Code Playgroud)
链接结果是Ok:
SearchArticles?refSearch=2&exact=False&manufacturerId=5&modelId=3485&engineId=-1&vehicleTypeId=5313&familyId=100032&page=0
Run Code Online (Sandbox Code Playgroud)
但如果我编码:
<%: Html.ActionLink(SharedResources.Shared_Pagination_First, Model.ActionToExecute, Model.ControllerToExecute, Model.FirstRouteValues, new { @title = string.Format(SharedResources.Shared_Pagination_LinkTitle, 0) })%>
Run Code Online (Sandbox Code Playgroud)
链接结果是:
SearchArticles?Count=10&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D
Run Code Online (Sandbox Code Playgroud)
有什么问题?唯一的区别是,在最后我使用的是htmlAttributes
我开始使用带有Razor语法的ASP.NET MVC 4框架开发应用程序.我想知道我应该在哪里(文件夹位置)创建我的HTML Helper类.最佳实践.
例如:
我有一个继承的MVC项目.在视图上,BeginForm标记中没有指定路由(控制器和操作).视图呈现正确,因此我假设它正在选择默认路由.
我的问题是,如果没有指定路线,它是如何知道使用的路线?这里的最佳做法是:您是指定路线还是让它默认?
所以视图是Views/Config/WorkCodes.cshtml,标签是
Html.BeginForm()
Run Code Online (Sandbox Code Playgroud)
它进入控制器ConfigController.cs并调用操作WorkCodes().如果我正在做这个项目,我会写的
Html.BeginForm("WorkCodes", "Config", FormMethod.Post)
Run Code Online (Sandbox Code Playgroud)
MVC如何知道使用哪个控制器和操作而不指定它?
WorkCodes.cshtml
@{
ViewBag.Title = "Work Codes";
}
@using (Html.BeginForm())
{
<div>
<table style="width: 100%;" class="trHoverHighlight">
<tbody>
<tr>
<td>
<br />
<div>
<button id="buttonCreateNew" type="button">Add New</button>
<button id="buttonReturn" type="button">Return</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
Run Code Online (Sandbox Code Playgroud)
}
ConfigController.cs
public ActionResult WorkCodes()
{
return View(Rep.GetWorkAll(true));
}
Run Code Online (Sandbox Code Playgroud)
这是从另一个视图中调用视图的位置:
@foreach (var itm in (List<string>)ViewBag.ListObjects)
{
<li>
<a href="../Config/@itm">Work Codes</a>
</li>
}
Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的案例,我想要你的启蒙.我有两个控制器.一般人员控制器使用行动方法和一个候选人控制器,用于与候选人相关的更具体的行动方法.我使用位于Person文件夹下的一个局部视图,以便在以后我想将其用于其他类型的Person时用作通用.目前,此局部视图使用针对候选控制器的Ajax.BeginForm.我正在使用的语法是
@using (Ajax.BeginForm("SaveCandidateLanguage", "Candidate",
new AjaxOptions
{
HttpMethod = "Post",
OnBegin = "onBeginFormValidation",
OnSuccess = "onSaveCandidateLanguageSuccess"
}))
{
// form input elements
}
Run Code Online (Sandbox Code Playgroud)
这种类型的Ajax.BeginForm正常工作,尽管它针对不同控制器中的操作.现在我的表单验证我不得不为我的Ajax.BeginForm添加一些参数.我的新语法是这样的:
@using (Ajax.BeginForm("SaveCandidateLanguage", "Candidate",
new AjaxOptions
{
HttpMethod = "Post",
OnBegin = "onBeginFormValidation",
OnSuccess = "onSaveCandidateLanguageSuccess"
},
new
{
id = "addEditCandidateLanguageForm",
novalidate = "novalidate"
}))
{
// form input elements
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这种方式无法找到Action方法.如果我将我的动作放在Person Controller中,它会再次正常工作.但是我想知道为什么会这样.我做了一些挖掘,但我没有设法得到答案.
从firebug我看到浏览器试图发布的URL是出于某种原因
HTTP:// {项目名} /人/ SaveCandidateLanguage长度= 9
代替
HTTP:// {项目名} /候选/ SaveCandidateLanguage长度= 9
我自然得到404未找到的回复.我还想知道变量是什么?我在网址末尾看到的长度= 9,它来自何处.
html-helper ×10
asp.net-mvc ×7
asp.net ×3
c# ×3
razor ×3
.net ×2
actionlink ×1
file-upload ×1
routevalues ×1