我创建了一个扩展方法,它将返回html帮助器TextBoxFor.现在我想对它进行单元测试,但它会抛出"对象引用未设置为对象的实例".
扩展方法
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper htmlHelper, .......)
{
/* some logic here */
===> (Null Exception)
return htmlHelper.TextBoxFor(......);
}
Run Code Online (Sandbox Code Playgroud)
HtmlHelper模拟是正确的,因为我已经在几个地方使用过它.
我有一个关于如何创建自定义View Helpers的问题.我想在我的索引视图中更改我的默认日期时间格式.我想编写自己的Helper,因为我觉得它很容易就像PHP一样.我做了:
创建类:
public static class CustomViewHelpers
{
public static MvcHtmlString returnDateString(string format, DateTime date)
{
return MvcHtmlString.Create(date.ToString(format));
}
}
Run Code Online (Sandbox Code Playgroud)我把它添加到web.config中,
我这样用过:
<p><em>
Birth date</em>
<%: CustomViewHelpers.returnDateString("D", Model.Birth_Date); %></p>
Run Code Online (Sandbox Code Playgroud)但我总是得到错误:
编译错误
描述:编译服务此请求所需的资源时发生错误.请查看以下特定错误详细信息并相应地修改源代码.
编译器错误消息:CS1026 :)预期
但我认为这是一个错误的错误,因为当我删除我的线它正常工作,我看到有这些")"标记.你能解释一下为什么这种助手不起作用吗?也许你知道如何在ASP.NET MVC2中编写自己的帮助程序的好教程?
我有这个代码:
<div class="mdl_bdy_frm">
@using (Html.BeginForm())
{
@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")
@Html.LabelFor(m => m.Login.UserName, new { @class = "adm" })
@Html.TextBoxFor(m => m.Login.UserName, new { @class = "adm", size = 30 })
@Html.ValidationMessageFor(m => m.Login.UserName)
@Html.LabelFor(m => m.Login.Password, new { @class = "adm" })
@Html.PasswordFor(m => m.Login.Password, new { @class = "adm", size = 30 })
@Html.ValidationMessageFor(m => m.Login.Password)
<br />
@Html.CheckBoxFor(m => m.Login.RememberMe, new { @class = "adm" })
@Html.LabelFor(m => m.Login.RememberMe, new …Run Code Online (Sandbox Code Playgroud) 我试图做的最终结果是通过反映对象及其属性来动态构建表单。
我已经创建了调用TextBoxFor和CheckBoxFor等的HtmlHelper方法,但是现在我需要帮助弄清楚如何将属性传递给Html.TextBoxFor时正确反映该属性。
这是辅助方法:
public static MvcHtmlString FormTextBox<TModel>(this HtmlHelper<TModel> helper, String id, String property_name, object model, RouteValueDictionary attributes)
{
Type model_type = model.GetType();
return helper.TextBoxFor(model_object => model_type.InvokeMember(property_name, BindingFlags.ExactBinding | BindingFlags.GetProperty, null, model, null));
}
Run Code Online (Sandbox Code Playgroud)
但是它会在返回时中断,并显示以下错误代码:
模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。
基本上我想知道这是什么:
@Html.TextBoxFor(model => model.Name)
Run Code Online (Sandbox Code Playgroud)
并将其转换为:
@FormHelpers.FormTextBox("Name", model)
Run Code Online (Sandbox Code Playgroud)
并输出相同的内容。
更新
我将重申这一点,因为我在解决问题上取得了一些进展。
我已经从Expression.PropertyOrField创建了一个表达式,该表达式恰好创建了我要寻找的东西。但是我不能让TextBoxFor函数接受它。
Expression fieldExpr = Expression.PropertyOrField(Expression.Constant(model),property_name);
return helper.TextBoxFor(Expression.Lambda<Func<TModel>>(fieldExpr, null).Compile()());
Run Code Online (Sandbox Code Playgroud)
关于如何正确将Expression传递给函数的任何想法?
我正在使用Ajax表单在页面中呈现局部视图.
见下面的代码
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery-1.7.1.min.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery.unobtrusive-ajax.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/MicrosoftAjax.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/MicrosoftMvcAjax.js") %>"></script>
<form id="aspnetForm" runat="server" style="height: 100%;">
<% using (Ajax.BeginForm("demo", "demo", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "divToUpdate" }, new { @ID = "AjaxForm" }))
{ %>
<%= Html.DropDownList("Demo", list, new { @id = "id", @class = "dropdown" })%>
<% }%>
<input type="submit" value="Save" />
<div id="divToUpdate">
<% Html.RenderPartial("UserControls/DemoPage"); %>
</div>
<% }%></form>
Run Code Online (Sandbox Code Playgroud)
在这我包括4 js.我有一个带有Form标签的页面,里面有一个prtial视图页面.当我选择下拉列表并单击保存按钮我想要ajax帖子但我发现整个页面正在重新加载.
有什么想法吗?
谢谢
我正在用MVC4做一些练习.我的练习项目是一种简单的评论板/论坛,允许注册用户和匿名用户发表评论.
目前,我已经设置了代码,以便即使注册用户也可以在提交小名称+消息表单时输入他们想要的任何名称.我想要的是为注册用户禁用此行为,而不是使用从其登录信息中获取的用户名.
理想情况下,注册用户的名称框中已经加载了用户名并且无法编辑.当表单经过验证时,将使用此用户名,这确保名称和消息都不为空.
这是我的视图中的代码:
<div class="editor-label">
@Html.LabelFor(x => x.comment.Name)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(x => x.comment.Name)
<br />
@if (User.Identity.Name=="") {
@Html.EditorFor(x => x.comment.Name)
} else {
@Html.EditorFor(x => x.comment.Name, Model.PosterName)
}
</div>
Run Code Online (Sandbox Code Playgroud)
请注意,Model.PosterName只是将用户的用户名保存为字符串.它不为null或为空.
如何编辑第二个EditorFor行,以便使用Model.PosterName作为默认选项?我是否应该使用DisplayFor代替不可编辑的行为?
我上面编写的代码没有任何值填充EditorFor.
谢谢!
我正在mvc4中建立一个新网站,我正在从数据库中检索菜单动态.为了防止在每个控制器和视图中反复执行相同的操作以创建菜单,我使用具有局部视图的部分控制器来构建菜单.由于这篇文章,我已经做到了这一点.
我想要实现的下一件事是根据当前控制器和动作确定当前活动菜单项,所以我创建了一个html帮助器来执行此操作.该代码基于本文.
我的代码看起来像这样;
Partialcontroller.cs
[ChildActionOnly]
public ActionResult MainMenu()
{
var viewModel = new MenuModel();
try
{
IList<MenuItem> menuItems = MenuService.First(x => x.Name == "MainMenu").MenuItems;
//Get the menuItems collection from somewhere
if (menuItems != null && menuItems.Count > 0)
{
viewModel.MenuItems = menuItems;
return View(viewModel);
}
}
catch (Exception exception)
{
//TODO: Exception handling and logging
}
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
MainMenu.cshtml
这是包含在布局中的局部视图,其中包含这段代码;
<nav class="nav-collapse collapse">
<ul class="row-fluid nav">
@foreach (var item in Model.MenuItems)
{
<li …Run Code Online (Sandbox Code Playgroud) 是否可以使用HtmlHelper创建CakePHP链接而不使用href属性?
<?php echo $this->Html->link('Enter'); ?>
Run Code Online (Sandbox Code Playgroud)
将输出:
<a href="">Enter</a>
Run Code Online (Sandbox Code Playgroud)
我想要的是这个:
<a>Enter</a>
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个自定义HTML帮助程序,这将导致HTML编辑器出现在MVC应用程序中.我一直按照以下说明操作:http://dan.cx/2012/05/custom-strongly-typed-htmlhelpers-in-asp-net-mvc.我不能让这个工作,我完全卡住了.
这是我创建的HtmlHelper .....
public static class HTMLEditor
{
public static HtmlString RenderFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, int? width = 810, int? height = 200)
{
var name = html
.ViewContext
.ViewData
.TemplateInfo
.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string myEditor = "<textarea id='" + name + "' ";
myEditor += "class='textarea' placeholder='' style='width: " + width + "px !important; height: " + height + "px !important'></textarea>";
myEditor += "<script>$('#" + name + "').wysihtml5({'html':true,'color': false,parser: …Run Code Online (Sandbox Code Playgroud) 我正在为RadioButtonFor提供额外的重载,并希望将键值对添加到传入的HTML属性中.
作为一个例子,我传递的内容如下:
new { id = "someID" }
Run Code Online (Sandbox Code Playgroud)
当我使用HtmlHelper.AnonymousObjectToHtmlAttributes方法似乎是我正在寻找的建议时,它产生了一个包含4个项目的字典,其中包含"Comparer","Count","Keys","Values"的键.然后我尝试使用Reflection来迭代"键"和"值"中的值,但是也无法使其工作.
基本上我想做的就是能够将htmlAttributes转换为IDictionary,添加一个项目,然后将其传递给常规的RadioButtonFor方法.
编辑:这是我真正想要做的事情.提供一个名为isDisabled的重载,以便能够设置单选按钮的禁用状态,因为这不能使用HTML属性直接轻松完成,因为disabled = false仍然会禁用被禁用的标记并禁用无线电.
public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, bool isDisabled, object htmlAttributes)
{
var linkAttributes = System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
Dictionary<string, object> htmlAttributesDictionary = new Dictionary<string, object>();
foreach (var a in linkAttributes)
{
if (a.Key.ToLower() != "disabled")
{
htmlAttributesDictionary.Add(a.Key, a.Value);
}
}
if (isDisabled)
{
htmlAttributesDictionary.Add("disabled", "disabled");
}
return InputExtensions.RadioButtonFor<TModel, TProperty>(htmlHelper, expression, value, htmlAttributesDictionary);
}
Run Code Online (Sandbox Code Playgroud) html-helper ×10
asp.net-mvc ×6
c# ×4
asp.net ×1
asp.net-ajax ×1
cakephp ×1
css ×1
editorfor ×1
href ×1
html ×1
hyperlink ×1
lambda ×1
reflection ×1
unit-testing ×1