2

I am using MVC 3 and Razor, attempting to post a form back to a controller from a telerik window (telerik.window.create) that loads a partial view. Im not sure how to post this so ill just post the code in order of execution and explain it as I go.

First an anchor is clicked, and onClick calls:

    function showScheduleWindow(action, configId) {
    var onCloseAjaxWindow = function () { var grid = $("#SubscriptionGrid").data("tGrid"); if (grid) { grid.rebind(); } };
    CreateAjaxWindow("Create Schedule", true, false, 420, 305, "/FiscalSchedule/" + action + "/" + configId, onCloseAjaxWindow);
}

And the CrateAjaxWindow method:

function CreateAjaxWindow(title, modal, rezible, width, height, url, fOnClose) {
    var lookupWindow = $.telerik.window.create({
        title: title,
        modal: modal,
        rezible: rezible,
        width: width,
        height: height,
        onClose: function (e) {
            e.preventDefault();
            lookupWindow.data('tWindow').destroy();
            fOnClose();
        }
    });

    lookupWindow.data('tWindow').ajaxRequest(url);
    lookupWindow.data('tWindow').center().open();
}

Here is the partial view that is being loaded:

@model WTC.StatementAutomation.Web.Models.FiscalScheduleViewModel
@using WTC.StatementAutomation.Model
@using WTC.StatementAutomation.Web.Extensions           

@using (Html.BeginForm("Create", "FiscalSchedule", FormMethod.Post, new { id = "FiscalScheduleConfigForm" }))
{
    <div id="FiscalScheduleConfigForm" class="stylized">
        <div class="top">
            <div class="padding">
                Using fiscal year end: @Model.FiscalYearEnd.ToString("MM/dd")
            </div>
            <div class="padding Period">
                <table border="0">
                    <tr>
                        <th style="width: 120px;"></th>                   
                        <th>Effective Date</th>
                        <th>Next Run</th>
                        <th>Start From Previous</th>
                    </tr>
                    <tr>
                        <td>
                            @Html.CheckBoxFor(m => m.HasMonthly)
                            <label>Monthly</label>
                        </td>
                        <td>
                            @{ var month = Model.GetForFiscalPeriod(FiscalPeriodStatementSchedule.FiscalPeriod.Monthly);}
                            @month.BaseSchedule.StartDate.ToString("MM/01/yyyy")
                        </td>
                        <td>
                            @month.BaseSchedule.NextScheduleRun.ToString("MM/dd/yyyy")
                        </td>
                        <td class="previous">
                            @(month.HasRun ? Html.CheckBoxFor(m => month.BaseSchedule.StartFromPreviousCycle, new { @disabled = "disabled", @readonly = "readonly" }) : Html.CheckBoxFor(m => month.BaseSchedule.StartFromPreviousCycle))    
                        </td>
                    </tr>
                     <tr>
                        <td>
                             @Html.CheckBoxFor(m => m.HasQuarterly)  Quarterly
                        </td>
                        <td>
                            @{ var quarter = Model.GetForFiscalPeriod(FiscalPeriodStatementSchedule.FiscalPeriod.Quarterly);}
                            @quarter.BaseSchedule.StartDate.ToString("MM/01/yyyy")
                        </td>
                        <td>
                            @quarter.BaseSchedule.NextScheduleRun.ToString("MM/dd/yyyy")
                        </td>
                        <td class="previous">
                            @(quarter.HasRun ? Html.CheckBoxFor(m => quarter.BaseSchedule.StartFromPreviousCycle, new { @disabled = "disabled", @readonly = "readonly" }) : Html.CheckBoxFor(m => quarter.BaseSchedule.StartFromPreviousCycle))    
                        </td >
                    </tr>   
                    <tr>
                        <td>
                             @Html.CheckBoxFor(m => m.HasAnnual) Annual
                        </td>
                        <td>
                            @{ var annual = Model.GetForFiscalPeriod(FiscalPeriodStatementSchedule.FiscalPeriod.Annual);}
                            @annual.BaseSchedule.StartDate.ToString("MM/01/yyyy")
                        </td>
                        <td>
                            @annual.BaseSchedule.NextScheduleRun.ToString("MM/dd/yyyy")
                        </td>
                        <td class="previous">

                            @(annual.HasRun ? Html.CheckBoxFor(m => annual.BaseSchedule.StartFromPreviousCycle, new { @disabled = "disabled", @readonly = "readonly" }) : Html.CheckBoxFor(m => annual.BaseSchedule.StartFromPreviousCycle))    
                        </td>
                    </tr>   
                    <tr>
                        <td>
                             @Html.CheckBoxFor(m => m.HasSemiAnnual) Semi-annual
                        </td>
                        <td>
                            @{ var semi = Model.GetForFiscalPeriod(FiscalPeriodStatementSchedule.FiscalPeriod.SemiAnnual);}
                            @semi.BaseSchedule.StartDate.ToString("MM/01/yyyy")
                        </td>
                        <td>
                            @semi.BaseSchedule.NextScheduleRun.ToString("MM/dd/yyyy")
                        </td>
                        <td class="previous">

                            @(semi.HasRun ? Html.CheckBoxFor(m => semi.BaseSchedule.StartFromPreviousCycle, new { @disabled = "disabled", @readonly = "readonly" }) : Html.CheckBoxFor(m => semi.BaseSchedule.StartFromPreviousCycle))    

                        </td>
                    </tr>     
                </table>
            </div>
            <div class="padding StartDay">
                <span>Run on day:</span>
                @Html.TextBoxFor(model => model.StartDay)
                <span>of every period.</span>
            </div>
        </div>
        <div class="bottom">
            <div class="padding">
                <div style="float: left;">
                    @if (Model.ShowSuccessSave)
                    {
                        <div id="successSave" class="label">Changes saved succesfully</div>
                    }
                    @Html.ValidationSummary(true)
                    @Html.HiddenFor(x => x.SubscriptionId)
                    @Html.HiddenFor(x => x.DeliveryConfigurationId)
                    @Html.HiddenFor(x => x.FiscalYearEnd)   
                </div>
                <a id="saveSchedule" class="btn" href="">Save</a>
            </div>
        </div>
    </div>
}

<script type="text/javascript">
    $(function () {
        $('a#saveSchedule').click(function () {
            $(this).closest("form").submit();
            return false;
        });
    });
</script>

And finally the controller method:

[HttpPost]
public ActionResult Create(FormCollection formValues, int subscriptionId, int deliveryConfigurationId, int startDay, DateTime fiscalYearEnd)
{

    if (ModelState.IsValid)
    {

        var selectedSchedules = GetCheckedSchedulesFromForm(formValues);
        var startFromPrevious = GetFromPreviouSelections(formValues);
        this.AddModelErrors(_fiscalScheduleService.AddUpdateSchedules(selectedSchedules, subscriptionId, deliveryConfigurationId, startDay, startFromPrevious));            
    }


    return new RenderJsonResult { Result = new { success = true, action = ModelState.IsValid ? "success" : "showErrors", 
                                  message = this.RenderPartialViewToString("_FiscalScheduleConfigForm", 
                                  BuildResultViewModel(deliveryConfigurationId, subscriptionId, fiscalYearEnd, ModelState.IsValid)) } };                        

}

As you can see I am using jQuery to post back to the controller, which I have done on several occasions in the applicaiton, this seems to work fine normally. But with this form, for some reason it is not posting back or stepping into the Create method at all. I am speculating that it has something to do with the parameters on the controller method. But I am fairly new to MVC (coming from ASP.NET world) so Im not really sure what I am doing wrong here. Any help would be greately appreciated!

4

2 に答える 2

5

startDayのtextboxforを変更することで、コントローラーに投稿することができました。

変更元:

@Html.TextBoxFor(model => model.StartDay)

に:

@Html.TextBoxFor(model => model.StartDay, new { id = "startDay" }) 
于 2012-12-13T15:47:26.403 に答える
1

My guess is that you're running on a virtual directory in IIS? That url you're generating is likely the culprit.

Hit F12, check out the network tab (and enable tracing) and see what it's trying to request.

Instead of building the link through text, why not use @Url.Action()? You could store this in an attribute on the a tag (like in an attribute called data-url, for example) and then use that info to make your call. It's pretty easy to pull out the attribute with jQuery, something like this:

$('.your-link-class').click(function(){
   var url = $(this).attr('data-url');
   // proceed with awesomesauce
});

Would something like that work for you?

[shameless self plug] As far as the controller action signature goes, you might want to look into model binding if you can. One simple class and many of your headaches will go away. You can read more here, read the parts on model binding. There are downloadable samples for different approaches.

Cheers.

于 2012-05-30T17:56:46.277 に答える