ASP.NET MVC传递数据从视图控制器 [英] ASP.NET MVC Passing Data from View to Controller

查看:141
本文介绍了ASP.NET MVC传递数据从视图控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有与包含添加到工作站项的网格的图。用户可以选择从下拉列表中选择一个项目,然后单击它调用一个控制器,增加了该项目的工作站的操作环节。我可以把它通过在控制器的动作后读的FormCollection对象工作。

 < P>
    <使用(Html.BeginForm(的AddItem,家)){%GT%;
    <标签=项目编号>项目:其中; /标签>
    <%= Html.DropDownList(项ID,Model.ItemsList)%GT;
    &所述;%= Html.Hidden(WorkstationID,Model.Workstation.RecordID)%GT;
    <输入类型=提交值=提交/>
    <%}%GT;
&所述; / P>


 的[AcceptVerbs(HttpVerbs.Post)
公众的ActionResult的AddItem(的FormCollection formValue)
{
    长workstationId = Convert.ToInt64(formValue [WorkstationID]);
    长的itemId = Convert.ToInt64(formValue [项目编号]);    工作站工作站= itilRepository.FindWorkstation(workstationId);
    项目项目= itilRepository.FindItem(的itemId);    itilRepository.AddItem(工作站项目);
    itilRepository.Save();    返回的内容(项添加成功!);
}

我想要做的是能够提交两个参数workstationId和的itemId使用Ajax.ActionLink控制器,并具有添加被插入到网格中的新项目。我来呈现网格是这样的:

 <表>
      &所述; TR>
        百分位>< /第i
      <第i个
        名称
      < /第i
      <第i个
        服务标签
      < /第i
      <第i个
        序列号
      < /第i
    < / TR>    <%的foreach(在Model.Items VAR项){%GT;    &所述; TR>
      &所述; TD>
        <%= Html.ActionLink(编辑,ItemEdit,新{ID = item.RecordID})%GT; |
        <%= Html.ActionLink(详细信息,ItemDetails,新{ID = item.RecordID})%GT;
      < / TD>
      &所述; TD>
        <%= Html.En code(item.Name)%GT;
      < / TD>
      &所述; TD>
        <%= Html.En code(item.ServiceTag)%GT;
      < / TD>
      &所述; TD>
        <%= Html.En code(item.SerialNumber)%GT;
      < / TD>
    < / TR>    <%}%GT;< /表>

我的问题是,当我提交使用ActionLink的我无法弄清楚如何在参数传递给控制器​​,以及如何不重新加载整个视图更新电网。

我真的AP preciate一些帮助,这甚至是链接到有类似的一个教程。

感谢您!

这是工作的版本,一个问题是,当控制器返回这是所有得到rendred实际页面已经一去不复返了。局部视图

 <使用(Ajax.BeginForm(的AddItem%,空,
        新AjaxOptions
        {
            UpdateTargetId =ResultsGoHere
            InsertionMode = InsertionMode.Replace
        },
        新{@id =itemForm}))
{%GT;    <标签=项目编号>项目:其中; /标签>
    &所述;%= Html.DropDownList(的itemId,Model.ItemsList)%GT;
    &所述;%= Html.Hidden(workstationId,Model.Workstation.RecordID)%GT;    < A HREF =#的onclick =$('#itemForm)提交();>提交< / A>    < D​​IV ID =ResultsGoHere>
        <%Html.RenderPartial(WorkstationItems,M​​odel.Items); %GT;
    < / DIV><%}%GT;

不知道原因是什么,替换正确工作之前,但控制器没有得到下拉值。现在控制器获得的价值,但返回的局部视图替换了整个页面。

操作方法:

 的[AcceptVerbs(HttpVerbs.Post)
公众的ActionResult的AddItem(字符串workstationId,字符串的itemId)
{
    长lworkstationId = Convert.ToInt64(workstationId);
    长litemId = Convert.ToInt64(的itemId);    工作站工作站= itilRepository.FindWorkstation(lworkstationId);
    项目项目= itilRepository.FindItem(litemId);    IQueryable的<项目>项目= itilRepository.AddItem(工作站项目);
    itilRepository.Save();    返回PartialView(WorkstationItems项目);
}

这是做所有工作的查看HTML:

 <%@页标题=LANGUAGE =C#的MasterPageFile =〜/查看/共享/的Site.Master继承=System.Web.Mvc.ViewPage< ITILDatabase.Models.WorkstationFormViewModel>中%GT;< ASP:内容ID =内容1ContentPlaceHolderID =TitleContent=服务器>
    工作站详细信息
< / ASP:内容>
< ASP:内容ID =内容2ContentPlaceHolderID =日程地址搜索Maincontent=服务器>    <脚本的src =/脚本/ MicrosoftAjax.js类型=文/ JavaScript的>< / SCRIPT>
    <脚本的src =/脚本/ MicrosoftMvcAjax.js类型=文/ JavaScript的>< / SCRIPT>
    <链接类型=文/ CSS的href =/../内容/ CSS / UI的亮度/ jQuery的-UI-1.7.2.custom.css的rel =stylesheet属性/>
    <脚本类型=文/ JavaScript的SRC =/../内容/ JS / jQuery的-1.3.2.min.js>< / SCRIPT>
    <脚本类型=文/ JavaScript的SRC =/../内容/ JS / jQuery的-UI-1.7.2.custom.min.js>< / SCRIPT>    < H2>
        工作站详情及LT; / H>
    <&字段集GT;
        <传奇>&领域LT; /传说>
        &所述p为H.;
            记录ID:
            <%= Html.En code(Model.Workstation.RecordID)%GT;
        &所述; / P>
        &所述p为H.;
            名称:
            <%= Html.En code(Model.Workstation.Name)%GT;
        &所述; / P>
        &所述p为H.;
            描述:
            <%= Html.En code(Model.Workstation.Description)%GT;
        &所述; / P>
        &所述p为H.;
            现场:
            <%= Html.En code(Model.Workstation.Site.Name)%GT;
        &所述; / P>
        &所述p为H.;
            修改者:
            <%= Html.En code(Model.Workstation.ModifiedBy)%GT;
        &所述; / P>
        &所述p为H.;
            修改于:
            <%= Html.En code(的String.Format({0:绿},Model.Workstation.ModifiedOn))%GT;
        &所述; / P>
        &所述p为H.;
            由...制作:
            <%= Html.En code(Model.Workstation.CreatedBy)%GT;
        &所述; / P>
        &所述p为H.;
            创建于:
            <%= Html.En code(的String.Format({0:绿},Model.Workstation.CreatedOn))%GT;
        &所述; / P>
    < /字段集>
    <&字段集GT;
        <传奇>人与LT; /传说>
        <%Html.RenderPartial(WorkstationPeople,Model.People); %GT;
    < /字段集>
    <&字段集GT;
        <传奇>仓位< /传说>
        <%Html.RenderPartial(WorkstationPositions,Model.Positions); %GT;
    < /字段集>
    <&字段集GT;
        <传奇>项目< /传说>            <使用(Ajax.BeginForm(的AddItem,家,空%,
                    新AjaxOptions
                    {
                        UpdateTargetId =ResultsGoHere
                        InsertionMode = InsertionMode.Replace
                    },
                    新{@id =itemForm}))
            {%GT;                <标签=项目编号>项目:其中; /标签>
                &所述;%= Html.DropDownList(的itemId,Model.ItemsList)%GT;
                &所述;%= Html.Hidden(workstationId,Model.Workstation.RecordID)%GT;                < A HREF =#的onclick =$('#itemForm)提交();>提交< / A>                < D​​IV ID =ResultsGoHere>
                    <%Html.RenderPartial(WorkstationItems,M​​odel.Items); %GT;
                < / DIV>            <%}%GT;
    < /字段集>
    < BR />
    &所述p为H.;
        <%= Html.ActionLink(编辑,WorkstationEdit,新{ID = Model.Workstation.RecordID})%GT;
        |
        <%= Html.ActionLink(返回目录,索引)%GT;
    &所述; / P>
< / ASP:内容>


解决方案

您从AJAX期待什么结果打电话?

您可以使用 AjaxHelper 对象的辅助方法,而不是的HtmlHelper 渲染的链接。例如,为了获得新的内容与AJAX HttpPOST呼叫和其插入< D​​IV> 设置的id ResultsGoHere 您呈现以下链接:

 <%= Ajax.ActionLink(编辑,ItemEdit
                         新{
                             的itemId = item.RecordId,
                             workstationId = myWorkStationId
                         },
                         新AjaxOptions {
                             列举HTTPMethod =POST
                             UpdateTargetId =ResultsGoHere
                             InsertionMode = InsertionMode.Replace
                         })%GT;

在你的 AcionMethod ,你可以简单地测试对 Request.IsAjaxRequest()来决定如何返回:

 的[AcceptVerbs(HttpVerbs.Post)
公众的ActionResult ItemEdit(字符串的itemId,串workstationId){
    //编辑的项目,并把它找回来    如果(Request.IsAjaxRequest()){
        返回PartialView(SingleItem项目);
    }
    返回RedirectToAction(ItemEdit,新{=的itemId item.RecordId,workstationId = workstationId});
}//后备GET请求
公众的ActionResult ItemEdit(字符串的itemId,串workstationId)
{
    //做的东西,并返回视图
}

I have a view with a grid that contains items added to a workstation. The user can select an item from a drop down list and click an action link which calls a controller that adds that item to the workstation. I can make it work by reading the FormCollection object in the Post action of the controller.

<p>
    <% using(Html.BeginForm("AddItem", "Home")) { %>
    <label for="ItemID">Item:</label>
    <%= Html.DropDownList("ItemID", Model.ItemsList) %>
    <%= Html.Hidden("WorkstationID", Model.Workstation.RecordID) %>
    <input type="submit" value="Submit" />
    <% } %>
</p>


[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddItem(FormCollection formValue)
{
    long workstationId = Convert.ToInt64(formValue["WorkstationID"]);
    long itemId = Convert.ToInt64(formValue["ItemID"]);

    Workstation workstation = itilRepository.FindWorkstation(workstationId);
    Item item = itilRepository.FindItem(itemId);

    itilRepository.AddItem(workstation, item);
    itilRepository.Save();

    return Content("Item added successfully!");
}

What I want to do is be able to submit the two parameters the workstationId and itemId to the controller using Ajax.ActionLink and have the new item that was added get inserted into the grid. I am rendering the grid like this:

<table>
      <tr>
        <th></th>
      <th>
        Name
      </th>
      <th>
        Service Tag
      </th>
      <th>
        Serial Number
      </th>
    </tr>

    <% foreach (var item in Model.Items) { %>

    <tr>
      <td>
        <%= Html.ActionLink("Edit", "ItemEdit", new { id = item.RecordID }) %> |
        <%= Html.ActionLink("Details", "ItemDetails", new { id = item.RecordID   })%>
      </td>
      <td>
        <%= Html.Encode(item.Name) %>
      </td>
      <td>
        <%= Html.Encode(item.ServiceTag) %>
      </td>
      <td>
        <%= Html.Encode(item.SerialNumber) %>
      </td>
    </tr>

    <% } %>

</table>

The problem I have is when I submit using the ActionLink I can't figure out how to pass in the parameters to the controller and how to update the grid without reloading the entire view.

I would really appreciate some help with this or even a link to a tutorials that does something similar.

Thank You!

This is the working version, the one problem is that when the controller returns the partial view that is all that gets rendred the actual page is gone.

<% using (Ajax.BeginForm("AddItem", null, 
        new AjaxOptions
        {
            UpdateTargetId = "ResultsGoHere",
            InsertionMode = InsertionMode.Replace
        }, 
        new { @id = "itemForm" } ))
{ %>

    <label for="ItemID">Item:</label>
    <%= Html.DropDownList("itemId", Model.ItemsList) %>
    <%= Html.Hidden("workstationId", Model.Workstation.RecordID) %>

    <a href="#" onclick="$('#itemForm').submit();">Submit</a>

    <div id="ResultsGoHere">
        <% Html.RenderPartial("WorkstationItems", Model.Items); %>
    </div>

<% } %>

Not sure what the cause is, the replace was working correctly before but the controller wasn't getting the drop down value. Now the controller is getting the value but the partial view that is returned replaces the entire page.

The Action Method:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddItem(string workstationId, string itemId)
{
    long lworkstationId = Convert.ToInt64(workstationId);
    long litemId = Convert.ToInt64(itemId);

    Workstation workstation = itilRepository.FindWorkstation(lworkstationId);
    Item item = itilRepository.FindItem(litemId);

    IQueryable<Item> items = itilRepository.AddItem(workstation, item);
    itilRepository.Save();

    return PartialView("WorkstationItems", items);
}

This is the HTML for the View that does all the work:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ITILDatabase.Models.WorkstationFormViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Workstation Details
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
    <link type="text/css" href="/../Content/css/ui-lightness/jquery-ui-1.7.2.custom.css" rel="stylesheet" />    
    <script type="text/javascript" src="/../Content/js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="/../Content/js/jquery-ui-1.7.2.custom.min.js"></script>

    <h2>
        Workstation Details</h2>
    <fieldset>
        <legend>Fields</legend>
        <p>
            Record ID:
            <%= Html.Encode(Model.Workstation.RecordID) %>
        </p>
        <p>
            Name:
            <%= Html.Encode(Model.Workstation.Name) %>
        </p>
        <p>
            Description:
            <%= Html.Encode(Model.Workstation.Description) %>
        </p>
        <p>
            Site:
            <%= Html.Encode(Model.Workstation.Site.Name) %>
        </p>
        <p>
            Modified By:
            <%= Html.Encode(Model.Workstation.ModifiedBy) %>
        </p>
        <p>
            Modified On:
            <%= Html.Encode(String.Format("{0:g}", Model.Workstation.ModifiedOn)) %>
        </p>
        <p>
            Created By:
            <%= Html.Encode(Model.Workstation.CreatedBy) %>
        </p>
        <p>
            Created On:
            <%= Html.Encode(String.Format("{0:g}", Model.Workstation.CreatedOn)) %>
        </p>
    </fieldset>
    <fieldset>
        <legend>People</legend>
        <% Html.RenderPartial("WorkstationPeople", Model.People); %>
    </fieldset>
    <fieldset>
        <legend>Positions</legend>
        <% Html.RenderPartial("WorkstationPositions", Model.Positions); %>
    </fieldset>
    <fieldset>
        <legend>Items</legend>

            <% using (Ajax.BeginForm("AddItem", "Home", null, 
                    new AjaxOptions
                    {
                        UpdateTargetId = "ResultsGoHere",
                        InsertionMode = InsertionMode.Replace
                    }, 
                    new { @id = "itemForm" } ))
            { %>

                <label for="ItemID">Item:</label>
                <%= Html.DropDownList("itemId", Model.ItemsList) %>
                <%= Html.Hidden("workstationId", Model.Workstation.RecordID) %>

                <a href="#" onclick="$('#itemForm').submit();">Submit</a>

                <div id="ResultsGoHere">
                    <% Html.RenderPartial("WorkstationItems", Model.Items); %>
                </div>

            <% } %>
    </fieldset>
    <br />
    <p>
        <%=Html.ActionLink("Edit", "WorkstationEdit", new { id = Model.Workstation.RecordID }) %>
        |
        <%=Html.ActionLink("Back to List", "Index") %>
    </p>
</asp:Content>

解决方案

What result are you expecting from the AJAX call?

You could use the AjaxHelper object's helper methods instead of the HtmlHelper to render the link. For example, to get new content with an AJAX HttpPOST call and insert it into a <div> with the id set to ResultsGoHere you render the following link:

<%= Ajax.ActionLink("Edit", "ItemEdit", 
                         new {
                             itemId = item.RecordId, 
                             workstationId = myWorkStationId
                         },
                         new AjaxOptions {
                             HttpMethod="POST",
                             UpdateTargetId="ResultsGoHere",
                             InsertionMode = InsertionMode.Replace 
                         }) %>

In your AcionMethod, you can simply test on Request.IsAjaxRequest() to decide what to return:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ItemEdit(string itemId, string workstationId) {
    // edit the item and get it back

    if (Request.IsAjaxRequest()) {
        return PartialView("SingleItem", item);
    }
    return RedirectToAction("ItemEdit", new { itemId = item.RecordId, workstationId = workstationId });
}

// fallback for get requests
public ActionResult ItemEdit(string itemId, string workstationId)
{
    // do stuff and return view
}

这篇关于ASP.NET MVC传递数据从视图控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆