Asp.net mvc 如何从辅助对象调用操作并避免渲染?

Asp.net mvc 如何从辅助对象调用操作并避免渲染?,asp.net-mvc,asp.net-mvc-4,html-helper,mvchtmlstring,Asp.net Mvc,Asp.net Mvc 4,Html Helper,Mvchtmlstring,我正在开发ASP.NE MVC4,我正在使用LungoJS库进行开发 我正在开发一个助手,以我需要的方式呈现LungoJS控件 对于Select输入,我希望得到一个JSON,其中包含每个选项的数据 我可以从现有控制器的操作中获取所需的JSON 但是,当我从帮助器调用操作时,视图会在标记中呈现我的html:-( <div class="form" id="address-data"> @Html.LungoInputFor(m => m.CaseServ

我正在开发ASP.NE MVC4,我正在使用LungoJS库进行开发

我正在开发一个助手,以我需要的方式呈现LungoJS控件

对于Select输入,我希望得到一个JSON,其中包含每个选项的数据

我可以从现有控制器的操作中获取所需的JSON

但是,当我从帮助器调用操作时,视图会在
标记中呈现我的html:-(

    <div class="form" id="address-data">

        @Html.LungoInputFor(m => m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId, "text", @Labels.Territory, @htmlAttributesRO, true)
        @Html.LungoSelectFor(m => m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId, @Labels.Territory, null, true, "GetTerritoryKendo", "Address")
看法


@Html.LungoInputFor(m=>m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId,“text”、@Labels.Territory、@htmlAttributesRO,true)
@Html.LungoSelectFor(m=>m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId,@Labels.Territory,null,true,“GetTerritoryKendo”,“Address”)
助手

public static MvcHtmlString LungoSelectFor(此HtmlHelper html,表达式,字符串标签=”,对象htmlAttributes=null,bool fieldset=false,字符串操作=”,字符串控制器=)
{
标记生成器标记=新标记生成器(“选择”);
JavaScriptSerializer js=新的JavaScriptSerializer();
MvcHtmlString data=ChildActionExtensions.Action(html、Action、controller);
object[]json=js.Deserialize(data.ToString());
foreach(json中的字典项)
{
foreach(项目中的var属性)
{
标记生成器选项=新标记生成器(“选项”);
开关(property.Key)
{
“选定”案例:
if((bool)property.Value)
{
选项。合并属性(“选定”、“选定”);
}
打破
案例“文本”:
option.InnerHtml=property.Value.ToString();
打破
案例“值”:
option.MergeAttribute(“value”,property.value.ToString());
打破
违约:
打破
}
tag.InnerHtml+=option.ToString(TagRenderMode.Normal);
}
}
返回MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}

我不明白为什么如果我从变量中的操作中获取htmlstring,并且在我只返回选择输入html之后,会影响整个页面…如果我评论
ChildActionExtensions.Action(html,Action,controller)
视图呈现良好(但没有我需要的内容…

您不应该在这里使用子操作(
ChildActionExtensions.Action
helper),因为它们直接写入响应。您可以改为在视图模型中包含包含所需集合的属性,并将其作为参数直接传递给您的helper。或者(但这不是一个好的解决方案)就是在助手中调用DAL来检索列表

    public static MvcHtmlString LungoSelectFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string label = "", object htmlAttributes = null, bool fieldset = false, string action = "", string controller = "")
    {
        TagBuilder tag = new TagBuilder("select");
        JavaScriptSerializer js = new JavaScriptSerializer();

        MvcHtmlString data = ChildActionExtensions.Action(html, action, controller);
        object[] json = js.Deserialize<object[]>(data.ToString());

        foreach (Dictionary<string,object> item in json)
        {
            foreach (var property in item)
            {
                TagBuilder option = new TagBuilder("option");
                switch (property.Key)
                {
                    case "Selected":
                        if ((bool)property.Value)
                        {
                            option.MergeAttribute("selected","selected");
                        }
                        break;
                    case "Text":
                        option.InnerHtml = property.Value.ToString();
                        break;
                    case "Value":
                        option.MergeAttribute("value", property.Value.ToString());
                        break;
                    default:
                        break;
                }
                tag.InnerHtml += option.ToString(TagRenderMode.Normal);
            }
        }

        return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));   
    }