如何将用户数据从视图传递到控制器并返回罗马数字

问题描述

我正在MVC中开发一个Web应用程序,当用户输入数字时,会将其转换为罗马数字。我已经完成了转换方法和基本视图页面。我正在努力通过httppost操作结果方法获取输入的数据,然后通过转换方法运行它。

到目前为止,这是我的控制器:

public class ConvertController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(FormCollection form)
    {            
        
    }

    public void OnConvertClicked(object sender,EventArgs e)
    {
        //Button clicked
        try
        {
            int number = Convert.ToInt32(myTextBox.Text);//Convert to number
            string romanNumber = ToRomanNumber(number);//Get roman number
        }
        catch (Exception ex)
        {
            //The user input was not a number...
            myTextBox.Text = "Error";
        }
    }

    public string ToRomanNumber(int num)
    {
        var listofNum = new List<int>() { 1000,900,500,400,100,90,50,40,10,9,5,4,1 };
        var listofRoman = new List<string>() { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };


        var numToRoman = "";
        for (int i = 0; i < listofNum.Count; i++)
        {
            while (num >= listofNum[i])
            {
                numToRoman += listofRoman[i];
                num -= listofNum[i];
            }
        }
        return numToRoman;
    }

}

这是我的观点

@{
    ViewBag.Title = "Index";
}

<h2>Numeral Converter</h2>
<fieldset>
    <legend>Convert numbers to roman numerals</legend>
    @using (Ajax.BeginForm("Index","ConvertController",new AjaxOptions { UpdateTargetId = "ConversionDeatils" }))
    {
        <div id="divInterestDeatils"></div>
        <ol>
            <li>
                @Html.Label("Enter Number to Convert")
                @Html.TextBox("myTextBox.Text")
            </li>

        </ol>
        <button>Convert</button>
    }
</fieldset>

解决方法

您需要创建一个ViewModel

public class MyViewModel {
    public string myNumber{ get; set; }
}

将您的视图更改为类似的内容

@model MyViewModel 
@{
    ViewBag.Title = "Index";
}

<h2>Numeral Converter</h2>
<fieldset>
    <legend>Convert numbers to roman numerals</legend>
    @using (Ajax.BeginForm("Index","ConvertController",new AjaxOptions { UpdateTargetId = "ConversionDeatils" }))
    {
        <div id="divInterestDeatils"></div>
        <ol>
            <li>
                @Html.Label("Enter Number to Convert")
                @Html.EditorFor(m => m.myNumber)
            </li>

        </ol>
        <button id="Submit" type="Submit" value="Convert"></button> 
    }
</fieldset>

您的控制器要

public class ConvertController : Controller
{
    public ActionResult Index()
    {
        MyViewModel myv = new MyViewModel();
        return View(myv);
    }


    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
        MyViewModel myv = new MyViewModel();
        decimal number = Convert.ToDecimal(form["myNumber"].ToString());
        myv.myNumber = ToRomanNumber(number);
        return View(myv);
    }


    public string ToRomanNumber(decimal num)
    {
        var listOfNum = new List<int>() { 1000,900,500,400,100,90,50,40,10,9,5,4,1 };
        var listOfRoman = new List<string>() { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" };


        var numToRoman = 0;
        for (int i = 0; i < listOfNum.Count; i++)
        {
            while (num >= listOfNum[i])
            {
                numToRoman += listOfRoman[i];
                num -= listOfNum[i];
            }
        }
        return numToRoman;
    }
}

尝试一下,@model MyViewModel 在这里您可能要根据视图模型的位置进行更改