2009-08-17 16 views
0

Ich baue zum ersten Mal eine MVC-App. Derzeit stellt meine App ein kleines Formular bereit, das dem Benutzer eine Eingabezeichenfolge (eine URL) und eine Submit-Anweisung zur Verfügung stellt, die Eingabe des Benutzers verwendet, um einen neuen Datensatz in der db-Tabelle zu erstellen und eine saubere URL auszugeben. Ich möchte eine Bedingung in meinem Homecontroller-Datei hinzufügen, dass wird:MVC, Aktion für Controller

1) überprüfen, ob die „url“ Eingabe bereits in der Datenbanktabelle vorhanden und 2) Wenn ja, wird dieser Rekord Verse zeigen einen doppelten Datensatz zu schaffen .

Index View -------------------- 

     <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

     <html xmlns="http://www.w3.org/1999/xhtml" > 
     <head runat="server"> 
      <title></title> 
     </head> 
     <body> 
      <div> 
      <form action="/Home/Create" method="post"> 
      Enter: <input type="text" name="urlToShorten" id="shortenUrlInput" /> 
      <input type="submit" value="Shorten" /> 
      </form> 

      </div> 



     </body> 
     </html> 

    Create View ------------------------------------------------------------ 

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <html xmlns="http://www.w3.org/1999/xhtml" > 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <div> 
     The clean url:<br /> 
     <%= string.Format("{0}/{1}",Request.Url.GetLeftPart(UriPartial.Authority),ViewData["shortUrl"]) %> 

     </div> 
    </body> 
    </html> 

    Homecontroller---------------------------------------------------------- 


     using System; 
     using System.Collections.Generic; 
     using System.Linq; 
     using System.Web; 
     using System.Web.Mvc; 
     using System.Web.Mvc.Ajax; 
     using ShortUrl.Models; 

     namespace ShortUrl.Controllers 
     { 
      [HandleError] 
      public class HomeController : Controller 
      { 
       public ActionResult Index() 
       { 
        return View(); 

       } 

       [HandleError] 
       public ActionResult Create(string urlToShorten) 
       { 
        if (string.IsNullOrEmpty(urlToShorten)) 

        { 

         return RedirectToAction("Index"); 
        } 



        else 
        { 
         long result = ShortUrlFunctions.InsertUrl(urlToShorten); 
         ViewData["shortUrl"] = result; 
         return View("Create"); 
        } 
       } 
       [HandleError] 
       public ActionResult Resolve(long? id) 
       { 
        if (!id.HasValue || id.Value == 0) 
        { 
         return RedirectToAction("Index"); 
        } 
        else 
        { 
         string url = ShortUrlFunctions.RetrieveUrl(id.Value); 
         if (url == null) 
         { 
          return RedirectToAction("Index"); 
         } 
         else 
         { 

          return Redirect(url); 
         } 
        } 
       } 
      } 
     } 

------------ShortUrlFunctions.cs 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace ShortUrl.Models 
{ 
    public static class ShortUrlFunctions 
    { 
     public static string RetrieveUrl(long inputKey) 
     { 
      using (ShortUrlEntities db = new ShortUrlEntities()) 
      { 


        var existingUrl = (from t in db.ShortURLSet where 
t.id == inputKey select t).Take(1); 
        if (existingUrl.Count() == 1) 
        { 
         return existingUrl.First().url; 

        } 
        else 
        { 
         return null; 
        } 
      } 
     } 

      public static long InsertUrl(string inputUrl) 
      { 
       long result = 0; 
       if(!string.IsNullOrEmpty(inputUrl)) 
       { 
        using (ShortUrlEntities db = new ShortUrlEntities()) 
        { 
         if (inputUrl.IndexOf(@"://") == -1) inputUrl = 
"http://" + inputUrl; 
          ShortURL su = new ShortURL(); 
         su.url = inputUrl; 
         db.AddToShortURLSet(su); 
         db.SaveChanges(); 
         result = su.id; 

      } 
     } 

       return result; 


    } 
    } 
} 
+1

Was genau ist Ihre Frage? Erhalten Sie einen Fehler? –

+0

Wo ist das Modell? Das ist der Punkt, an dem der Großteil des Condition Testings (das Filtern von Müll in der Steuerung ist in Ordnung) sollte und definitiv dort sein sollte, wo die Bedingungserhöhung leben sollte (die der Controller in ModelState verpacken und zurückgeben kann). – 48klocs

Antwort

0

Was Sie brauchen, ist eine Methode, auf ShortUrlFunctions Klasse, die überprüfen können, ob eine bestimmte url in der Datenbank vorhanden ist. Wenn das Verfahren gestattet GetIdForUrl dann tun alles, was Sie brauchen, ist Ihr Create Aktion wie folgt zu ändern:

 [HandleError] 
     public ActionResult Create(string urlToShorten) 
     { 
      if (string.IsNullOrEmpty(urlToShorten)) 
      { 
       return RedirectToAction("Index"); 
      } 

      // No need for an else here since you have a return on the if above. 

      long result = ShortUrlFunctions.GetIdForUrl(urlToShorten); 


      // I am assuming that the function above returns 0 if url is not found.    
      if (result == 0) 
      { 
       result = ShortUrlFunctions.InsertUrl(urlToShorten); 
      } 

      ViewData["shortUrl"] = result; 
      return View("Create"); 
     } 

EDIT: (Als Antwort auf Ihren Kommentar)

Eine Beispielimplementierung von GetIdForUrl wäre:

public static long GetIdForUrl(string inputUrl) 
{ 
    using (ShortUrlEntities db = new ShortUrlEntities()) 
    { 
     var checkUrl = (from t in db.ShortURLSet 
         where t.url == inputUrl select t.id); 

     if (checkUrl.Count() == 1) 
     { 
      return checkUrl.First(); 
     } 
     else 
     { 
      return 0; 
     } 
    } 
} 
+0

danke für Ihre Antwort. sollte meine Funktion in etwa so aussehen? public static lang GetIdForUrl (string inputUrl) { mit (ShortUrlEntities db = new ShortUrlEntities()) { var checkUrl = (von t in db.ShortURLSet wo t.url == t wählen inputUrl) .Nehmen (1); if (checkUrl.Count() == 1) { Rückgabe checkUrl.id; –

+0

Das Ende Ihres Kommentars ist abgeschnitten, aber nach dem, was ich gesammelt habe, würde das funktionieren. Beachten Sie jedoch, dass Sie das ".Take (1)" nach der Abfrage nicht benötigen; Sie können nach ".Count() == 1" ohne dieses "Take" suchen. Auch kann ich das Ende nicht sehen, aber ich nehme an, dass Sie 0 zurückgeben, wenn keine Datensätze gefunden werden. – paracycle

+0

Die Antwort wurde als Antwort auf Ihren Kommentar erweitert. – paracycle

0

Sie müssen [AcceptVerbs(HttpVerbs.Post)] der Methode Sie erstellen hinzufügen möchten das Formular Post zu übernehmen.

Hoffnung, die hilft,

Dan

+0

Er wird dieses Attribut nicht benötigen, da dieses Attribut verwendet wird, um die Behandlung auf POST zu beschränken. Auf der anderen Seite, ja, es wäre schön, wenn er dieses Attribut setzen würde, da er nur POST-Anfragen akzeptiert. – paracycle

+0

In der Tat, guter Punkt, gut gemacht;) –

Verwandte Themen