你如何直接从Html.Editor中的Object additionalViewData加载一个值?

时间:2011-04-04 13:11:26

标签: c# asp.net-mvc asp.net-mvc-3

在Html.Editor(技术上EditorExtensions.Editor)中有一个带有签名

的重载
public static MvcHtmlString Editor(
    this HtmlHelper html,
    string expression,
    Object additionalViewData
)

你究竟应该如何使用additionalViewData? MSDN文档根本不清楚。

我的第一个想法是:

@Html.Editor("quijibo", new { quijibo = "homer simpson" })

然而这不起作用,所以我现在处于亏损状态。

编辑:修改过的问题如何在Html.Editor中直接从Object additionalViewData加载一个值?我想在additionalViewData中放置一个值作为该编辑器的数据值。

3 个答案:

答案 0 :(得分:11)

@Html.Editor("quijibo", new { quijibo = "homer simpson" })

并在相应的编辑器模板中,您可以从ViewData中获取值:

@ViewData["quijibo"]

或ViewBag如果您愿意:

@ViewBag.quijibo

完整示例:

型号:

public class MyViewModel
{
    public string Name { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Name = "abc"
        };
        return View(model);
    }
}

查看:

@Html.Editor("Name", new { foo = "bar" })

并在被调用的编辑器模板(~/Views/Shared/string.cshtml)内:

@model string
<span>@Model</span>
<span>@ViewData["foo"]</span>

我个人建议您使用强类型帮助器Html.EditorFor使用lambda表达式而不是Html.Editor

答案 1 :(得分:2)

我的问题的答案是内置类是不可能的。

它们的代码结构会覆盖你想要的东西

htmlAttributes: new { value = "x" }

我发现这非常不方便。我创建了与MVC方法的内部工作并行的方法,这些方法类似于:

private static TagBuilder CreateHiddenTag(string inputName, object value, 
        object htmlAttributes)
{
    var tagBuilder = new TagBuilder("input");

    tagBuilder.MergeAttribute("type", "hidden");
    tagBuilder.MergeAttribute("name", inputName);

    tagBuilder.GenerateId(inputName);

    if (value != null)
        tagBuilder.MergeAttribute("value", value.ToString());

    if (htmlAttributes != null)
        tagBuilder.MergeAttributes(
            HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), 
            replaceExisting: true);

    return tagBuilder;
}

主要区别在于我订购的电话tagBuilder.MergeAttributes 最后,因此您始终可以使用object htmlAttributes覆盖任何内容。 MVC源代码采用相反的方式并首先应用属性,从而使其解决方案的灵活性大大降低。

答案 2 :(得分:0)

您可以构建自己的HtmlHelper。创建自己的文件HtmlHelper.cs,玩得开心。下面的示例显示匿名对象:

namespace System.Web.Mvc.Html
{
    public static class MyExtensions
    {
        public static MvcHtmlString DisplayObject(this HtmlHelper htmlHelper, string propertyName, object anonymousModel)
        {
            string result = anonymousModel.GetType().GetProperty(propertyName).GetValue(anonymousModel).ToString();

            return new MvcHtmlString(result);
        }
    }
}

这是你的观点:

@Html.DisplayObject("quijibo", new { quijibo = "homer simpson" })

向google询问&#34; mvc custom html helper&#34;如果你想了解更多信息。祝你好运。