серверная функция с параметром - PullRequest
0 голосов
/ 03 августа 2009

Мне любопытно, как передать параметр в функцию на стороне сервера, которая выглядит следующим образом?

<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;
}

Таким образом, существует проблема с передачей параметра в вызов функции ...

EDIT

Хорошо, я начинаю чувствовать, что runat = "server" не так. Ну, я представляю некоторые машины и там свойства. Здесь я хочу отфильтровать текущие результаты (от общего содержимого машины, истории и т. Д.) На основе местоположения этих машин. Это означает, что текущее действие должно остаться прежним - вычислить тот же набор результатов, только отфильтрованный до текущего выбранного местоположения (я) - взятый из ссылки, который изменяет значение Session ["location"], например во всем мире.

Ответы [ 3 ]

1 голос
/ 03 августа 2009

Вы можете использовать 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());  
}

Затем вам нужно создать свой собственный метод, который принимает параметр.

1 голос
/ 03 августа 2009

Хорошо, я все еще немного смутен в том, что вам действительно нужно, но я попробую (хотя, боюсь, это вызовет больше вопросов, чем ответов; -).

В вашем global.asax.cs добавьте маршрут, подобный следующему:

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

Тогда все ваши ссылки в вашем представлении будут выглядеть так (где 'value' - это значение вашего фильтра):

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

Теперь в вашем контроллере Machines:

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");
}

Savvy?

Я не совсем доволен перенаправлением в конце, но я сделал это для простоты, чтобы попытаться помочь вам понять вещи проще. С jQuery вы можете сделать несколько обтекаемых и сексуальных вещей и вернуть результат в формате JSON ... но это уже другой уровень.

HTHS
Charles

1 голос
/ 03 августа 2009

Что такое стоимость? Это какое-то свойство LinkButton? Если да, то вы можете получить к нему доступ через отправителя.

Если это что-то еще, то AFAIK либо использует упомянутый вами способ, либо вы можете написать собственный обработчик событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...