asp.net mvc-mvc HtmlHelpers与Razor的问题



我在一个非营利捐赠平台上工作,这是我第一次使用MVC。我大部分时间都掌握了窍门,但现在我遇到了一个不知道如何解决的问题。我正在使用AthorizeNet。Helpers类,当我从expamples中添加代码时,它在大多数情况下都有效,除了它采用表单并将其放在标记上方,但它将表单字段放在正确的位置。我正试图弄清楚如何在正确的位置呈现标记。

@using AuthorizeNet.Helpers;
@using (Html.BeginSIMForm("http://127.0.0.1:4768", 1.99M, "xxx_key", "yyy_key", true))
{
    @Html.Raw(Html.CheckoutFormInputs(true))
    @Html.Hidden("order_id", "1234")
    <input type = "submit" value = "Pay" />
}

这就是它在HTML输出中的样子:

<form action = 'https://test.authorize.net/gateway/transact.dll' method = 'post'>
    <input type = 'hidden' name = 'x_fp_hash' value = '6bef386eaa89944efd62b47b86042910' >
    <input type = 'hidden' name = 'x_fp_sequence' value = '117'>
    <input type = 'hidden' name = 'x_fp_timestamp' value = 'xxx_key' >
    <input type = 'hidden' name = 'x_login' value = 'yyy_key' >
    <input type = 'hidden' name = 'x_amount' value = '1.99' >
    <input type = 'hidden' name = 'x_relay_url' value = 'http://127.0.0.1:4768' >
    <input type = 'hidden' name = 'x_relay_response' value = 'TRUE' >
</form><!DOCTYPE html>
<html>
<body>
<h2>Payment Information</h2>
                <div style = 'border: 1px solid #990000; padding:12px; margin-bottom:24px; background-color:#ffffcc;width:300px'>Test Mode</div>
                <div style = 'float:left;width:250px;'>
                    <label>Credit Card Number</label>
                    <div id = 'CreditCardNumber'>
                        <input type = 'text' size = '28' name = 'x_card_num' value = '4111111111111111' id = 'x_card_num'/>
                    </div>
                </div>  
                <div style = 'float:left;width:70px;'>
                    <label>Exp.</label>
                    <div id = 'CreditCardExpiration'>
                        <input type = 'text' size = '5' maxlength = '5' name = 'x_exp_date' value = '0116' id = 'x_exp_date'/>
                    </div>
                </div>
                <div style = 'float:left;width:70px;'>
                    <label>CCV</label>
                    <div id = 'CCV'>
                        <input type = 'text' size = '5' maxlength = '5' name = 'x_card_code' id = 'x_card_code' value = '123' />
                    </div>
                </div><input id="order_id" name="order_id" type="hidden" value="1234" />        <input type = "submit" value = "Pay" />

这就是我修复它的方法。

正如您所说,添加@Html。围绕Html拖动()。CheckoutFormInputs(true)

要做的另一个更改是

namespace AuthorizeNet.Helpers -> CheckoutFormBuilders.cs

添加的使用

using System.IO;

更改

HttpResponseBase to TextWriter

我在三个地方做了这个。

HttpResponseBase _response; to TextWriter _response;
public SIMForm(TextWriter response, string returnUrl, decimal amount, 
               string apiLogin, string transactionKey)
               :this(response,returnUrl,amount,apiLogin,transactionKey,true){}
public SIMForm(TextWriter response, string returnUrl, decimal amount, 
               string apiLogin, string transactionKey, bool isTest) {
        _response = response;
        _amount = amount;
        _apiLogin = apiLogin;
        _transactionkey = transactionKey;
        _returnUrl = returnUrl;
        _isTest = isTest;
        OpenForm();
}

还有两个变化

按照tpeczek答案中的指示,您需要更改

helper.ViewContext.HttpContext.Response 

helper.ViewContext.Writer

这看起来像

public static SIMForm BeginSIMForm(this HtmlHelper helper, string returnUrl, 
                                decimal amount, string apiLogin, 
                                string transactionKey) {
return new SIMForm(helper.ViewContext.Writer,
                    returnUrl,amount,apiLogin,
                    transactionKey,true);}
public static SIMForm BeginSIMForm(this HtmlHelper helper, string returnUrl, 
                                decimal amount, string apiLogin, 
                                string transactionKey, bool isTest) {
return new SIMForm(helper.ViewContext.Writer, 
                    returnUrl, amount, apiLogin, 
                    transactionKey,isTest);}

当为ASP编写直接写入输出流的助手时,通常会发生这种问题。NET MVC 1(以及using中包含的助手在大多数情况下直接写入输出流)。在ASP。NET MVC 1中,您可以使用以下内容编写输出流:

htmlHelper.ViewContext.HttpContext.Response.Output

在以后的ASP。NET MVC版本你应该使用这个:

htmlHelper.ViewContext.Writer

这确保了Razor的兼容性。如果您有权访问AuthorizeNet。帮助源代码你可以自己修复它,如果你不这样做,你必须联系作者来修复它。

AuthorizeNet中的帮助程序可能没有正确编写以使用Razor。如果不仔细研究它们组装的来源,很难说是不是这样。您可能需要尝试联系他们的客户支持。

使用上面EpicThreeDev的示例,我能够正确显示表单html。然而,"支付"按钮被并置在ccv字段上方,因此为了在Index.chtml代码库中修复这一问题,我将HTML更改为

                     <br />                           
     <input type = "submit" value = "Pay"  style="position:relative; top:35px;" />    

一旦我这样做了,我就可以张贴表格,但在这样做之后,我收到了邮寄的错误。

http://community.developer.authorize.net/t5/Integration-and-Testing/Having-Trouble-setting-up-MVC3-application-with-DPM/m-p/13226

这是我的解决方案。它只打印Authorize.net隐藏字段,这样您就可以编写自己的表单标记。在web.config中填写相关的AppSettings值。通过这种方式,您可以轻松地在开发和生产之间进行更改。

 public static class MyAuthNetHelper
 {
    public const string TEST_URL =  "https://test.authorize.net/gateway/transact.dll";
    public const string LIVE_URL = "https://secure.authorize.net/gateway/transact.dll";
    public static string ApiLogin
    {
        get { return ConfigurationManager.AppSettings["AuthNetAPILogin"]; }
    }
    public static string TransactionKey
    {
        get { return ConfigurationManager.AppSettings["AuthNetAPITransactionKey"]; }
    }
    public static string ReturnUrl
    {
        get { return ConfigurationManager.AppSettings["AuthNetReturnUrl"]; }
    }
    public static string ThanksUrl
    {
        get { return ConfigurationManager.AppSettings["AuthNetThanksUrl"]; }
    }
    public static bool TestMode
    {
        get { return bool.Parse(ConfigurationManager.AppSettings["AuthNetTestMode"]); }
    }
    public static string GatewayUrl
    {
        get { return TestMode ? TEST_URL : LIVE_URL; }
    }
    public static MvcHtmlString AuthNetDirectPostFields(this HtmlHelper helper, decimal amount)
    {
        var seq = Crypto.GenerateSequence();
        var stamp = Crypto.GenerateTimestamp();
        var fingerPrint = Crypto.GenerateFingerprint(TransactionKey,
            ApiLogin, amount, seq.ToString(), stamp.ToString());
        var str = new StringBuilder();
        str.Append(helper.Hidden("x_fp_hash", fingerPrint));
        str.Append(helper.Hidden("x_fp_sequence", seq));
        str.Append(helper.Hidden("x_fp_timestamp", stamp));
        str.Append(helper.Hidden("x_login", ApiLogin));
        str.Append(helper.Hidden("x_amount", amount));
        str.Append(helper.Hidden("x_relay_url", ReturnUrl));
        str.Append(helper.Hidden("x_relay_response", "TRUE"));
        return MvcHtmlString.Create(str.ToString());
    }   
}

cshtml:

    <form id="paymentForm" method="POST" action="@MyAuthNetHelper.GatewayUrl" class="form-horizontal offset1">
@Html.AuthNetDirectPostFields(PutYourAmountHere)
...
</form>

ThanksUrl在您的操作中用于处理来自Authorize.net的响应。有关详细信息,请查看此项:http://developer.authorize.net/integration/fifteenminutes/csharp/

相关内容

  • 没有找到相关文章

最新更新