带参数的服务器端功能

时间:2009-08-03 08:24:20

标签: asp.net-mvc

我很好奇,如何将参数传递给服务器端函数,看起来像这样?

<asp:LinkButton ID="lkbChange" runat="server" OnClick="lkbChange_Click" />

然后服务器端函数看起来像这样:

<script runat="server">
protected void lkbChange_Click(Object sender, EventArgs e)
{
    Session["location"] = new_value;
}
<script >

我想要像:

<asp:LinkButton ID="lkbChange" runat="server" OnClick="lkbChange_Click(<%= value %>)" />

protected void lkbChange_Click(Object sender, EventArgs e, string value)
{
    Session["location"] = value;
}

因此将参数传递给函数调用也存在问题......

修改

好的,我开始觉得runat =“server”错了。好吧,我正在介绍一些机器和那些属性。我想要的是根据这些机器的位置过滤当前结果(总机器内容,历史等)。这意味着当前操作应该保持不变 - 计算相同的结果集,仅过滤到当前选择的位置 - 从链接获取,将会话[“位置”]的值更改为例如。无处不在。

3 个答案:

答案 0 :(得分:1)

什么是价值?它是LinkBut​​ton的一些属性吗?如果是,那么您可以通过发件人访问它。

如果是其他内容,那么AFAIK要么使用您提到的方式,要么您可以编写自定义事件处理程序。

答案 1 :(得分:1)

您可以使用CommandArgument和CommandName来实现这一目标。

<asp:LinkButton ID="lkbChange" runat="server" CommandArgument="MyArg"   
CommandName="ThisLnkClick" OnClick="MyHandler" />

您创建处理程序:

protected void MyHandler(Object sender, EventArgs e)
{

      Button lnkButton = (Button)sender;  
      //You could handle different command names by doing something like: if (lnkButton.CommandName == "ThisLnkClick") ...
      CustomMethod(lnkButton.CommandArgument.ToString());  
}

然后,您必须创建一个带参数的自定义方法。

答案 2 :(得分:1)

好吧,我对你实际需要的东西仍然有点朦胧但是我会试一试(虽然我担心它会引起更多问题而不是答案; - )。

在您的global.asax.cs中添加类似于此的路线:

routes.MapRoute(
    "MachineList",
    "Machines/AddLocationFilter/{filterValue}",
    new { controller = "Machines", action = "AddLocationFilter", filterValue = "" }
);

然后,您视图中的所有链接都会像('value'是您的过滤器值):

<%= Html.ActionLink("link text",
                    "AddLocationFilter",
                    new { filterValue = value })%>

现在在您的机器控制器中:

public ActionResult Index()
{
    //Get your machines here
    //NOTE: I have no idea how you want this to work and this is just an example of how it could work
    IQueryable<Machine> machines = myMachineRepository.GetAllMachines();

    //Use the "FilterLocations" session value if it exists
    if (Session["FilterLocations"] != null)
    {
        IList<string> filterLocations = Session["FilterLocations"] as List<string>
        machines.Where(m => Locations.Contains(m.Location))
    }

    //Now send the filtered list of machines to your view
    return View(machines.ToList());
}

public ActionResult AddLocationFilter(string filterValue)
{
    //If there isn't a filterValue don't do anything
    if (string.IsNullOrEmpty(filterValue))
        return RedirectToAction("index");

    IList<string> filterLocations;
    //Get it from session
    if (Session["FilterLocations"] != null)
        filterLocations = Session["FilterLocations"] as List<string>

    //If it's still null create a new one
    if (filterLocations == null)
        filterLocations = new List<string>();

    //If it doesn't already contain the value then add it
    if (!filterLocations.Contains(filterValue))
        filterLocations.Add(filterValue);

    //Finally save it to the session
    Session["FilterLocations"] = filterLocations;

    //Now redirect
    return RedirectToAction("index");
}

精明?

我对最后的重定向并不完全满意,但为了简单起见我这样做是为了帮助您更轻松地理解事物。您可以使用jQuery做一些简化和性感的事情并返回JSON结果......但这是另一个级别。

HTHS
查尔斯