Как передать пользовательские данные из представления в контроллер и вернуть римскую цифру

#asp.net #asp.net-mvc

#asp.net #asp.net-mvc

Вопрос:

Я работаю над веб-приложением в MVC, которое, когда пользователь вводит число, преобразует его в римскую цифру. У меня есть метод преобразования и базовая страница просмотра. Я борюсь с получением введенных данных в методе результата действия 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>
  

Комментарии:

1. вам нужно использовать type='submit' кнопку

2. Спасибо, это сработает? location.href='» @Url.Action(«OnConvertClicked», «ConvertController») «‘»);» />

3. нет необходимости onclick , и вам нужно вызвать OnConvertClicked из метода [httppost]

4. хорошо, так что мне это не нужно, тогда public ActionResult Index(FormCollection form) { }

5. я постараюсь написать один пример ответа

Ответ №1:

вам нужно создать 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 здесь вы можете захотеть изменить в соответствии с положением вашей модели представления

Комментарии:

1. спасибо, в этой строке ошибка myv.myNumber = ToRomanNumber(number); (number) часть говорит, что невозможно преобразовать из decimal в int

2. попробуйте изменить ToRomanNumber(int num) на ToRomanNumber(decimal num) и var numToRoman = ""; на var numToRoman = 0;

3. или, если вы уверены, что будет введено только целое число, измените decimal number = Convert.ToDecimal(form["myTextBox"].ToString()); на int number = Convert.ToInt32(form["myTextBox"].ToString());

4. ошибка с этой строкой десятичное число = Преобразовать. ToDecimal(форма [«MyTextBox»]. toString()); говорит, что ссылка на объект не установлена для экземпляра объекта

5. извините, я забыл изменить имя текстового поля, измените myTextBox на имя текстового поля ur, myNumber