Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC HtmlHelpers trouble with Razor

I'm working on a non-profit donation platform and I'm using MVC for the first time. I've got the hang of it for the most part but right now I'm having a problem that I dont know how to address. I'm using the AthorizeNet.Helpers class and when I add the code from the expamples, it works for the most part except for it takes the form and puts it ABOVE the tag however it puts the form fields in the correct place. I'm trying to figure out how to render the tag in the correct place.

@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" />
}

This is how it looks in HTML output:

<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" />
like image 471
user676111 Avatar asked May 24 '11 22:05

user676111


2 Answers

This is how I fixed it.

As you stated, add @Html.Raw() around Html.CheckoutFormInputs(true)

The other change to make is in

namespace AuthorizeNet.Helpers -> CheckoutFormBuilders.cs

add a using of

using System.IO;

Change

HttpResponseBase to TextWriter

I did this in three spots.

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

Two more changes left

As directed in tpeczek answer, you need to change

helper.ViewContext.HttpContext.Response 

to

helper.ViewContext.Writer

This will look like

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);}
like image 112
EpicThreeDev Avatar answered Nov 02 '22 23:11

EpicThreeDev


This kind of problem usually happens when a helper which is writing directly to output stream was written for ASP.NET MVC 1 (and helpers that are enclosed in using are writing directly to output stream most of the time). In ASP.NET MVC 1 you could write to output stream by using this:

htmlHelper.ViewContext.HttpContext.Response.Output

In later ASP.NET MVC version you should be using this:

htmlHelper.ViewContext.Writer

That ensures Razor compatibility. If you have access to AuthorizeNet.Helpers source code you can fix it by yourself, if you don't than you have to contact authors for fixing it.

like image 39
tpeczek Avatar answered Nov 02 '22 22:11

tpeczek