MVC HtmlHelpers проблемы с бритвой - PullRequest
5 голосов
/ 25 мая 2011

Я работаю на некоммерческой платформе для пожертвований и впервые использую MVC.Я понял это по большей части, но сейчас у меня проблема, которую я не знаю, как решить.Я использую класс AthorizeNet.Helpers, и когда я добавляю код из примеров, он работает по большей части, за исключением того, что он принимает форму и помещает ее над тегом, однако он помещает поля формы в правильное место.Я пытаюсь выяснить, как отобразить тег в правильном месте.

@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 ]

12 голосов
/ 08 декабря 2011

Вот как я это исправил.

Как вы сказали, добавьте @ Html.Raw () к 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);}
5 голосов
/ 25 мая 2011

Такая проблема обычно возникает, когда помощник, который пишет напрямую в выходной поток, был написан для ASP.NET MVC 1 (а помощники, включенные в использование, пишут напрямую в выходной поток большую часть времени).В ASP.NET MVC 1 вы можете записать в выходной поток, используя это:

htmlHelper.ViewContext.HttpContext.Response.Output

В более поздней версии ASP.NET MVC вы должны использовать это:

htmlHelper.ViewContext.Writer

Это обеспечивает Razorсовместимость.Если у вас есть доступ к исходному коду AuthorizeNet.Helpers, вы можете исправить его самостоятельно, если нет, то вам нужно связаться с авторами для его исправления.

1 голос
/ 20 января 2012

Используя пример из 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

1 голос
/ 25 мая 2011

Возможно, что помощник из AuthorizeNet не написан правильно для работы с Razor.На самом деле, не глядя на источник их сборки, трудно сказать, так ли это.Возможно, вы захотите связаться со службой поддержки.

0 голосов
/ 05 ноября 2013

Вот мое решение. Он просто печатает скрытые поля 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/

...