Asp.net mvc 4 在Html.BeginForm中传递路由值,但在action方法中得到零

Asp.net mvc 4 在Html.BeginForm中传递路由值,但在action方法中得到零,asp.net-mvc-4,routes,Asp.net Mvc 4,Routes,我有一个动作方法,它接收一个参数: public ActionResult Citizens(string docId){ //bla bla } 我认为: @using(Html.BeginForm("Citizens","DocSearch",FormMethod.Get)){ @Html.TextBox("docId",null,new {id="txtSearch"}) <input type="submit" value="Search" /> }

我有一个动作方法,它接收一个参数:

public ActionResult Citizens(string docId){
  //bla bla
}
我认为:

@using(Html.BeginForm("Citizens","DocSearch",FormMethod.Get)){
    @Html.TextBox("docId",null,new {id="txtSearch"})
    <input type="submit" value="Search" />
}
当我单击submit按钮时,我希望docId是txtSearch的值。但事实并非如此,而是将带有文本框值的查询字符串添加到url中,而不是用该值替换路由中的docid。我该怎么做才能让它工作

编辑:为了给你更多的洞察力,让我告诉你我在我的行动方法中做了什么。我检查docId的值,如果它是“0”,那么我只返回视图而不传递任何模型。如果它与“0”不同,我构建模型并将其传递给视图操作。在剃刀端,我检查模型是否为空。如果为空,那么我只显示一个搜索文本框和submit按钮,它(根据我的需要)指向相同的操作方法,但这次将docId参数设置为搜索文本框的值。这将导致构建模型并将其发送回视图,视图将相应地渲染模型

看法
@{if(Model==null)
{
@使用(Html.BeginForm(“公民”,“文档搜索”,FormMethod.Get)){
@TextBox(“docId”,null,new{id=“txtSearch”})
}   
}
其他的
{渲染模型}
行动
public ActionResult公民(字符串docId)
{
如果(文档ID!=“0”)
{
DocumentCitizenRepository docRepo=新的DocumentCitizenRepository();
IEnumerable documents=docRepo.documents.Where(x=>x.DocID.Contains(DocID)).ToList();
MiscellaneousRepository MiscellaneousRepository=新的MiscellaneousRepository();
IEnumerable searchResults=(来自文档中的文档)
在杂项报告中加入官员。官员
在doc.addressedOfficeId.Value上等于officer.OfficeId
选择新建DocSearchViewModel
{
AddressedTo=string.Format(“{0}{1}{2}”、officer.LastName、officer.FirstName、officer.Patronymic),
Author=string.Format(“{0}{1}{2}”、doc.LastName、doc.FirstName、doc.Patronymic),
DocDate=doc.ReceivedDate,
DocNumber=doc.DocID,
内容=doc.TextValues.Subject
}).ToList();
返回视图(视图名称:“索引”,模型:searchResults);
}
否则//我们将检查razor上的模型是否为空,并采取相应的措施。
{
返回视图(视图名称:“索引”);
}
}
这是我提交后得到的HTML:

<form action="/DocSearch/Citizens/0" method="get" novalidate="novalidate">
            <input type="text" name="docId" ,id="txtDocNumber"> 
             <input type="submit"  value="Search">
</form>

在路线中选择docId

    routes.MapRoute(name: "DocUrl",
                    url: "{controller}/{action}/{docid}",
                    defaults: new {controller = " DocSearch",
                         action = "Citizens",
                         docid = UrlParameter.Optional}

);
说明:


Html.BeginForm实现使用
UrlHelper.GenerateUrl
,它根据您的路由集合生成Url。基本上,它将与您使用
@Url.RouteUrl(“DocUrl”)

获得的Url相同。我怀疑,因为它是一个get方法,所以该值是从路由值填充的(在POST方法中优先的表单值可能甚至没有被读取-为什么它们不是POST时会被读取)@StephenMuecke,我对我的工作做了更多的解释。你能看一看吗。也许我的方法完全错了。你能为表单发布生成的HTML吗?在对表单进行子匹配后,在什么时候生成的?我认为你需要采取更传统的方法,使用GET-and-post方法,其中post方法接收包含搜索文本,然后您可以重定向到GET方法,如果您想生成新视图,则将搜索文本传递给它(路由值优先于查询字符串值,因此我认为您无法做到这一点)
    public ActionResult Citizens(string docId)
    {
        if (docId != "0")
        {
            DocumentCitizenRepository docRepo = new DocumentCitizenRepository();
            IEnumerable<DocumentCitizen> documents = docRepo.Documents.Where(x => x.DocID.Contains(docId)).ToList();
            MiscellaneousRepository miscRepo = new MiscellaneousRepository();
            IEnumerable<DocSearchViewModel> searchResults = (from doc in documents
                                                             join officer in miscRepo.Officers
                                                                  on doc.AddressedOfficerID.Value equals officer.OfficerID
                                                             select new DocSearchViewModel
                                                             {
                                                                 AddressedTo = string.Format("{0} {1} {2}", officer.LastName, officer.FirstName, officer.Patronymic),
                                                                 Author = string.Format("{0} {1} {2}", doc.LastName, doc.FirstName, doc.Patronymic),
                                                                 DocDate = doc.ReceivedDate,
                                                                 DocNumber = doc.DocID,
                                                                 Content = doc.TextValues.Subject
                                                             }).ToList();
            return View(viewName: "Index", model: searchResults);
        }
        else//We'll check if the model is null on the razor and act accordingly.
        {
            return View(viewName: "Index");
        }

    }
<form action="/DocSearch/Citizens/0" method="get" novalidate="novalidate">
            <input type="text" name="docId" ,id="txtDocNumber"> 
             <input type="submit"  value="Search">
</form>
    routes.MapRoute(name: "DocUrl",
                    url: "{controller}/{action}/{docid}",
                    defaults: new {controller = " DocSearch",
                         action = "Citizens",
                         docid = UrlParameter.Optional}

);