English 中文(简体)
SP MVC表格,要求采取具体行动,不改变方向,但更新原页
原标题:ASP MVC form to call specific action and not redirect but update original page

我用ASP.net MVC 3 来做一个项目,现在我更了解它,但也试图了解它与我长期以来一直使用的WebForms世界之间的差异。 之前在WebForms中,你只要把字段放在那里,添加一个按钮,然后创建一个事件,然后处理任何需要处理的后退问题。

例如,我有一个简单的视图, 显示错误的细节。 我想将关于这个错误的一些信息输入到我们的发行跟踪 MS API 。 只需说明错误的主题和内容。 在 HTML 中, 我会做一些类似的事情 :

<form action="@Url.Action("Send")" method="post">
    <input id="subject" name="subject" type="text" value="@Model.subject" />
    <br />
    <input id="content" name="content" type="text" value="@Model.content" />
    <br />
    <input type="submit" value="Send" />
</form>

我发现在我的控制器中命名我输入的 ID 来匹配参数名称后, 我就可以通过这些参数。 这与您在旧的 http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form- posting-scenarios.aspx” rel = “nofollow” >Scott Guthrie 上看到的相同。

首先,我要在我的错误控制器中调用发送动作, 而不是我的“ 细节 ” 。 这实际上叫做我的“ 发送动作 ”, < 坚固 >, 但随后又重定向到本地主机/ 错误/ 发送, 我不想这样做 。

我希望能够提交此表格, 请求和采取行动, 并对远程 API 进行工作, 然后更新当前页面上的信息, 指出错误已经转移 。

问题提交错误追踪器后,我如何在原始页面上显示DIV, 将内容传回它(例如,与问题追踪器中的问题的链接)?

<强> 更新日期: 这是我在控制器里所做的:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/redmine/issues.json");
request.Credentials = new NetworkCredential("username", "password");
request.Method = "POST";
request.ContentType = "application/json";
request.Accept = "application/json";

using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(" issue : { " +
                      " project_id :  project , " +
                      " subject :  Test issue " +
                      "}");
}

WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
string json = "";

using (StreamReader reader = new StreamReader(stream))
{
    json = reader.ReadToEnd();
}

这也是我所认为的(在菲利普的帮助下,

@model webapp.Models.app_errors

<script type="text/javascript">
 function SendErrors() {    

           alert(@Model); // here I get a  webapp undefined error 
           alert(Model); // Model is undefined. If I reference @Model.App_name or another value anywhere, works fine in rest of view

        $.ajax({
            type:  POST , //(probably)
            url:  ../SendToRedmine ,
            cache: false, //(probably)
            dataType:  json , //(probably)
            data: @Model,
            success: function(result)
            {
                alert("The error has been transferred");
                //you can also update your divs here with the `result` object, which contains whatever your method returns
            }
            });
    }
</script>

<input type="button" onclick= SendErrors() />
最佳回答

回答你的第一个问题 试试这个超载的Url

Url.Action("ActionName","ControllerName")

还有第二个问题 你会想通过AJAX做

基本上, 页面第一次被装入, 返回您想要显示的屏幕。 然后, 使用此窗体的 ajax 函数 :

<script type="text/javascript">
    function SendErrorsOrWhatever()
    {
        dummy =  error: myError, someOtherProperty = property ;  //this of course assumes that  myError  and  property  exist
        $.ajax({
        type:  GET , //i changed this because it actually probably better suits the nature of your request
        url:  ../Details/Send ,
        cache: false, //(probably)
        dataType:  json , //(probably)
        data: dummy,  //json object with any data you might want to use
        success: function(result)
        {
            alert("The error has been transferred");
            //you can also update your divs here with the `result` object, which contains whatever your method returns
        }
        });
    }
</script>

A few things to note: 1) The url is automatically appended to include the data from data. 2) Your action method now needs to accept a parameter. There are many ways to go about this. I have added an example of what your action method might look like in the code below.

然后您的按钮 s 点击 事件将调用此函数, 例如 :

<input type="button" onclick= SendErrorsOrWhatever() />

这里发生的情况是,当按下按钮时, Ajax 将(默认情况下)不同步地(按默认方式)击中你的动作方法,而你的动作方法将随错误而做,然后当它完成后,将按回 success 回调。

现在,你的行动可能看起来是这样的:

[AcceptVerbs(HTTP.Get)]
public static Error GetErrors(Error error)
{
    //do all your processing stuff
}

现在, 这假设 Juson 对象 < code> dummy 有与 < code> Error 类相同的字段。 如果是, MVC 将自动对它进行数据绑定。 您也可以对参数使用更通用的 < code > FormCollection 。 真的, 您可以使用任何您想要的, 但是您会想要在 Juson 对象中包装任何您想要的东西 。

关于你最后一个问题,这应该有用:

在您的应用程序中添加以下扩展方法 :

public static class JsonExtensions
{
    public static string ToJson(this Object obj)
    {
        return new JavaScriptSerializer().Serialize(obj);
    }
}

或者,如果你想的话,你可以在你的模型类中加入一种 ToJson () 方法,然后:

var model = @Model.ToJson();

在 ajax 调用之前的 js 中。然后使用 model 变量来计算您的 data 参数。

问题回答

在MVC中,“行动”基本上是一个“页面”。 (不确切,但通过路线,结果大多属实)

也就是说,你们的行动被归类为类别,并被引导到监查方案框架内使用路线。

我想你想在这里做的是 做一个AJAX电话 发送错误信息到网络服务。

除此之外, 您可以使用 jQuery 插入一个隐藏的 < code> div , 其中包含一个 Iframe , 上面还有另一个动作页面。 不过, 我建议不这样做 。

有两种可能性。

  1. 在您错误/ Send 动作中, 错误/ send 动作将用户重定向到本地主机/ 错误/ 细节/ 细节页面。 这可以用控制器上的 < code> redirect () 方法完成。 此方法的问题是它是一个屏蔽电话。 用户将不得不等待远程 pip 被调用并响应 。

  2. 使用批注中提到的 AJAX 方法。 其缺点是它比较复杂, 您可能需要对服务进行民意调查才能恢复状态, 除非它是火灾, 忘记电话, 然后是钱 。

使用AJAX是更优雅的解决办法。

使用 AJAX 是解决这个问题的方法之一 。 但是您可能想要重新思考页面的外观 。 如果这是您的提交问题页面, 您是否想要在您提交问题后留在此页面上 。 如果我继续提交问题, 您是否想要只看到最新问题的链接? 您可能需要对服务器进行民意调查, 以获取提交问题的链接, 这使得链接变得更加困难 。

在不知道这些要求的情况下,很难找到任何解决办法,但一般而言,一旦从提交文件的页面(例如~/issu/id)上提交文件,我就去另一个问题页。

另外,您还可以使用 Html.TextboxFor(mgt;m.subject) 或类似语法的语法, 这样您就不必为每个属性手动匹配输入 ID 。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Transaction handling with TransactionScope

I am implementing Transaction using TransactionScope with the help this MSDN article http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx I just want to confirm that is ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

Microsoft.Contracts namespace

For what it is necessary Microsoft.Contracts namespace in asp.net? I mean, in what cases I could write using Microsoft.Contracts;?

Separator line in ASP.NET

I d like to add a simple separator line in an aspx web form. Does anyone know how? It sounds easy enough, but still I can t manage to find how to do it.. 10x!

热门标签