Asp.net mvc 3 单击按钮时将参数从视图传递到控制器

Asp.net mvc 3 单击按钮时将参数从视图传递到控制器,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,我已经创建了自己的扩展,如下所示: public static MvcHtmlString hSearch(this HtmlHelper helper, string labelName, string labelCaption, string textName, string textValue, string tableName, string buttonId, string actionName, string controllerName, object route

我已经创建了自己的扩展,如下所示:

public static MvcHtmlString hSearch(this HtmlHelper helper, string labelName, string labelCaption, string textName, string textValue, string tableName, string buttonId, 
        string actionName, string controllerName, object routeValues, object htmlAttributes)
    {            
        var textbuilder = new TagBuilder("input");
        textbuilder.MergeAttribute("id", textName);
        textbuilder.MergeAttribute("name", textName);
        textbuilder.MergeAttribute("value", textValue);
        textbuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));


        ModelMetadata metadata = ModelMetadata.FromStringExpression(labelName, helper.ViewData);
        String innerText = labelCaption ?? (metadata.DisplayName ?? (metadata.PropertyName ?? labelName.Split('.').Last())); 
        if (String.IsNullOrEmpty(innerText)) 
        { 
            return MvcHtmlString.Empty; 
        }
        TagBuilder labelbuilder = new TagBuilder("label");
        labelbuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(labelName)));
        labelbuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        labelbuilder.SetInnerText(innerText);            

        //return new MvcHtmlString(textbuilder.ToString());
        var buttonBuilder = new TagBuilder("button");
        buttonBuilder.MergeAttribute("id", buttonId);
        buttonBuilder.SetInnerText(buttonId);

        var formBuilder = new TagBuilder("form");
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

        formBuilder.Attributes.Add("action", urlHelper.Action(actionName, controllerName, routeValues));

        formBuilder.Attributes.Add("method", "Post");

        formBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        formBuilder.InnerHtml = labelbuilder.ToString() + textbuilder.ToString() + buttonBuilder.ToString();
        return new MvcHtmlString(formBuilder.ToString());
    }
我将视图中的扩展用作:

 @Html.hSearch("lblSrch", "Company", "companyName", (string)TempData["cName"], "CHComp", "Search", "Fetch", "Home", null, null)
现在我想在单击按钮时将tableName传递给控制器。。我的控制器如下所示:

    public ActionResult Fetch(string search, string tablename)
    {
        var c = cbo.fetchData(search, tablename);
        return PartialView(c.ToList());
    }

正在等待答复。。谢谢。

您还没有给我们您的助手的代码,但据猜测它会写出一个标签、一个文本字段(textName)和一个按钮。如果是这种情况,它将通过HTTP将/get
companyName=someValue
发送回控制器

如果字段是从视图动态发送的,则通常需要向控制器添加
FormCollection
。或者,为什么不将文本搜索输入的名称保持为静态,例如将绑定到同名控制器参数的
name=“search”

编辑
您可以在一个隐藏字段中将tableName传递回控制器(
//codes
对我们没有帮助。该方法显然是您的大部分代码..您可以将其显示给我们吗(hSearch即..)我已经更新了代码。
hSearch
实际上做了什么?你说的是什么按钮?
Fetch
action返回的是什么视图?这是一个非常庞大的代码,可以用最少的努力将它放进一个PartialView中(并且可以重用).您之所以创建HtmlHelper而不是部分视图,是因为什么原因吗?我只是想创建它来搜索数据库中不同表中的数据,以便在所有程序中重复使用此代码..我不想将搜索值发送给控制器,而是想将文本框值加上表名发送给有一次我点击了按钮。你能给我一个更好的建议吗?我的视图中只有一个标签、一个文本框和一个按钮。。