MVC HtmlHelpers与Razor有关

use*_*111 5 asp.net-mvc html-helper authorize.net 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" />
}
Run Code Online (Sandbox Code Playgroud)

这是它在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" />
Run Code Online (Sandbox Code Playgroud)

Epi*_*Dev 12

这是我修复它的方式.

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

要做的另一个改变是

namespace AuthorizeNet.Helpers -> CheckoutFormBuilders.cs
Run Code Online (Sandbox Code Playgroud)

添加一个使用

using System.IO;
Run Code Online (Sandbox Code Playgroud)

更改

HttpResponseBase to TextWriter
Run Code Online (Sandbox Code Playgroud)

我在三个地方做到了这一点.

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();
}
Run Code Online (Sandbox Code Playgroud)

还剩下两个变化

按照tpeczek的回答,你需要改变

helper.ViewContext.HttpContext.Response 
Run Code Online (Sandbox Code Playgroud)

helper.ViewContext.Writer
Run Code Online (Sandbox Code Playgroud)

这看起来像

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);}
Run Code Online (Sandbox Code Playgroud)


tpe*_*zek 5

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

htmlHelper.ViewContext.HttpContext.Response.Output
Run Code Online (Sandbox Code Playgroud)

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

htmlHelper.ViewContext.Writer
Run Code Online (Sandbox Code Playgroud)

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