将从视图中的linq语句检索的值传递给其控制器

时间:2013-07-24 02:12:48

标签: c# asp.net-mvc linq

我有一个包含c#和linq的视图(不理想,但我必须使用它!):

protected void Page_Load(object sender, EventArgs e)
{
 .
 .
var qry = (from p in db.EntityObject
                       where something == something_else
                       select new
                            {
                                <fields>
                            }).FirstOrDefault();
 .
 .
}
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
.
.

我需要将通过视图中的linq语句检索的值传递给我的控制器。我试过这个:

 var qry = (from <entity objects>       
 select new
                        {
                            id,
                            // fields
                        }).FirstOrDefault();
 RouteData.Values.Add("id", qry.id);

然后我尝试将其作为值传递给隐藏的输入类型:

<input type="hidden" value="<%Int32.Parse(RouteData.Values["id"].ToString())"/>

但是,当我使用Chrome的工具查看输入元素时,'value'为空。我不知道如何通过从linq中恢复的字段来查看它在控制器中的相应操作。

我的视图是基于实体框架中的表强类型的,我想要从视图到控制器传递的'id'不在该表中。除非必须,否则我不想创建一个模型,仅用于一个额外的字段。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我可能误解了您的问题,但看起来您正试图在视图中获取值,并使该值可用于控制器中运行的代码 。该视图通过ViewContext.Controller具有控制器的句柄,您可以将其转换为控制器的类型然后进行交互。例如,您可以向控制器添加属性,然后从视图中设置它。我不确定你为什么这样做,因为控制器的工作通常在视图渲染时完成,但如果你想要追求它,它是一个选项。

答案 1 :(得分:0)

您应该创建一个ViewModel,并根据ViewModel强化您的View类型。您的ViewModel可以是这样的:

public class MyViewModel
{
  public MyModel MyModel { get; set; }
  public int Id { get; set; }
}

然后,在您的视图中,您将拥有:

<%: Html.HiddenFor(model => model.Id) %>