MVC HtmlHelpers与Razor有关

时间:2011-05-24 22:00:27

标签: asp.net-mvc razor html-helper authorize.net

我正在开发一个非盈利捐赠平台,我第一次使用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" />

5 个答案:

答案 0 :(得分:12)

这是我修复它的方式。

如你所说,在Html.CheckoutFormInputs(true)附近添加@ Html.Raw()

要做的另一个更改是

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

答案 1 :(得分:5)

这种问题通常发生在为ASP.NET MVC 1编写直接写入输出流的帮助程序时(并且使用中包含的帮助程序大多数时间直接写入输出流)。在ASP.NET MVC 1中,您可以使用以下命令写入输出流:

htmlHelper.ViewContext.HttpContext.Response.Output

在以后的ASP.NET MVC版本中,你应该使用它:

htmlHelper.ViewContext.Writer

确保Razor兼容性。如果您可以访问AuthorizeNet.Helpers源代码,则可以自行修复,如果不是,则必须联系作者进行修复。

答案 2 :(得分:1)

AuthorizeNet的帮助程序可能无法正确编写以与Razor一起使用。如果没有真正查看其装配的来源,很难说是否是这种情况。您可能想尝试与他们的客户支持联系。

答案 3 :(得分:1)

使用上面的EpicThreeDev示例,我能够正确显示html表单。然而,Pay按钮并置在ccv字段上方,因此为了在Index.cshtml代码库上修复它,我将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

答案 4 :(得分:0)

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

 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/